2013-10-15 54 views
2

我在我的代碼中收到以下錯誤。'System.Exception.HResult'由於其保護級別而無法訪問

編譯器錯誤信息:CS0122:「System.Exception.HResult」不可訪問由於其保護級別

我在App_Code文件夾中一個類和使用該類的LogException()方法插入異常細節到數據庫。

業務訪問層參考已經提供給這個類來訪問功能。

我在我的本地機器和本地IIS中試過,它工作正常。但是當我在Windows服務器IIS上託管它時,它會給我錯誤。

請幫我解決這個問題。

更新時間:

下面是我在App_Code/Exception.cs類函數,我引用這個類中的業務接入層。

public static void LogException(Exception ex, string userId, string refPage, string appName) 
{ 
    try 
    { 
     ExceptionManager objEx = new ExceptionManager(); // this is business class 
     objEx.InsertErrorLog(userId, appName, ex.HResult, ex.GetHashCode(), ex.GetType().ToString(), ex.Message, ex.Source, ex.StackTrace, refPage); 
    } 
    catch { 
     DestroySession(); 
    } 
} 
+0

即使在本地機器上也沒有辦法,你可以調用該對象本身之外受保護的制定者。此外,你爲什麼試圖首先設置HResult?如果它來自另一個異常,請保存此例外 –

+0

理解正在發生的事情並指出您朝着正確方向顯示導致錯誤的實際代碼要容易得多。 – TeaDrivenDev

+0

我試圖得到錯誤代碼,沒有設置它。 – Chirag

回答

6

聽起來像是你試圖設置ExceptionHResult財產。你不能這樣做,因爲它的設置是protected。如果你需要設置這個屬性,那麼你唯一的選擇是派生一個新類型的Exception,例如

public class CustomException : Exception 
{ 
    public CustomException(string message, int hresult) 
     : base(message) 
    { 
     HResult = hresult 
    } 
} 

在我看來,你的實際問題是在你的開發/部署環境之間的.NET版本的差異。 HResult財產完全是protected直到4.5。我認爲,你看到這個曾經部署過的原因是因爲你正在使用舊版本的.NET。

您將需要在部署機器上安裝.NET 4.5。

+0

如果您*需要*設置它,請在後代類中進行設置。 – Lloyd

+0

@PanagiotisKanavos啊,不用擔心我也會去除地雷。 – James

+0

我只是將異常作爲參數傳遞給該方法,並使用ex.HResult獲取登錄數據庫的錯誤代碼。 – Chirag

1

更新到.NET 4.5。或者撥打System.Runtime.InteropServices.Marshal.GetHRForException

從原來的職位代碼,這種變化:

public static void LogException(Exception ex, string userId, string refPage, string appName) 
{ 
    try 
    { 
     ExceptionManager objEx = new ExceptionManager(); // this is business class 
     objEx.InsertErrorLog(userId, appName, 
       System.Runtime.InteropServices.Marshal.GetHRForException(ex), 
       ex.GetHashCode(), ex.GetType().ToString(), ex.Message, ex.Source, ex.StackTrace, refPage); 
    } 
    catch { 
     DestroySession(); 
    } 
} 
+0

這應該被標記爲正確的答案。 – rkagerer

相關問題