在覆盖成员时,违反了inheritance安全规则 – SecurityRuleSet.Level2

我有一个inheritance自Exception的类。 在.NET 4中,我开始收到一个运行时错误:

在覆盖成员时,违反了inheritance安全规则:MyBusinessException.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)'。 重写方法的安全性可访问性必须匹配被重写的方法的安全性可访问性。

我认为这个问题是由我覆盖GetObjectData的事实造成的。

我知道解决这个问题的一个答案是设置SecurityRuleSet:

[assembly: SecurityRules(SecurityRuleSet.Level1)] 

这不是一个可以接受的答案,我想知道如何解决这个问题,而不必放松在.NET 4中的默认安全规则。

使用SecurityCriticalAttribute标记GetObjectData ,因为它应用于Exception.GetObjectData 。 重写的成员应具有相同的安全性可访问性(严重,安全关键或透明)。

阅读.NET Framework 4中的安全更改和MSDN中的安全透明代码2级以获取更多信息。

要避免所有潜在的安全运行时exception,请使用安全规则集启用代码分析。 您将得到可能对应于运行时错误的静态分析警告。

当我调用具有AllowPartiallyTrustedCallers属性的程序集时遇到此问题:

 [assembly: System.Security.AllowPartiallyTrustedCallers] 

删除它解决了我的问题,而不切换到SecurityRuleSet.Level1。

关于允许完全信任的应用程序的共享主机环境中的这个错误。 当你bin部署一个应用程序,你经常覆盖web.config。 在IIS下,当您将信任设置更改为与默认值不同的设置时,您的webconfiguration部分将被修改为:

 <system.web> <trust level="Full" /> <system.web> 

在部署过程中复制新的web.config通常会覆盖此设置,但IISpipe理员仍然会将该站点显示为“完全信任”,实际上该站点运行在默认信任级别为共享主机提供程序(通常是中等) 。

你会看到这个错误,并做我所做的 – 试图弄清楚为什么你会看到它,即使你知道该网站是在充分信任的情况下运行,实际上,事实并非如此。 解决scheme是在部署之前修改您的Webconfiguration,或使用IIS Admin将站点设置为不同的信任级别(例如高),应用它,然后将其设置回满。 这样做会重新插入必要的configuration文件信息,并以完全信任的方式重新启动应用程序池。

对我来说,问题出在log4net库上。 我下载了源代码,并将项目文件添加到我的解决scheme,以便我可以进入外部库。 但是,log4net需要为条件编译定义的NET_4_0符号。 默认情况下,它定义了NET_1_0 。 我进入了log4net项目属性,并将NET_1_0更改为NET_4_0 ,并解决了这个问题。

另外:也许我没有按照最佳做法,将图书馆纳入我的项目。 如果是这样的话,我会欢迎不同方式的反馈,以及每个select的利弊。 我目前的想法是,如果出现错误,能够看到图书馆的来源将帮助我了解图书馆的期望,这将帮助我清除错误。 另外,看到其他人如何编写源代码是没有用的,如果不是一个有价值的学习经验。 基本上,我试图按照在这里find的杰夫·阿特伍德的build议。 但是,如果有更好的方法来实现这一目标,我就会全神贯注。