2013-10-15 64 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

相关问题