2010-06-16 78 views
42

我有一个从Exception继承的类。在.NET 4中,我开始收到一个运行时错误:继承安全规则 - SecurityRuleSet.Level2

Inheritance security rules violated while overriding member: MyBusinessException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'. Security accessibility of the overriding method must match the security accessibility of the method being overriden.

我觉得这个问题是由我重写GetObjectData这个事实引起的。

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

[assembly: SecurityRules(SecurityRuleSet.Level1)] 

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

回答

32

马克GetObjectDataSecurityCriticalAttribute,因为它适用于Exception.GetObjectData。重写的成员应该具有相同的安全可访问性(严重,安全关键或透明)。

阅读Security Changes in the .NET Framework 4Security Transparent Code, Level 2从MSDN以获取更多信息。

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

+3

很酷,工作!我实际上已经尝试过这种方法,但我在课堂级别而不是在成员级别应用了该属性。 – 2010-06-16 19:27:27

+1

我想在InitializeLifeTimeService上做这件事,它不想工作,得到相同的错误。 – adriaanp 2011-01-17 14:10:04

+0

我该怎么做?你能显示一些代码吗? – brainmurphy1 2013-06-08 03:47:31

11

关于在共享托管环境中,可以充分信任的应用程序此错误。在您部署应用程序时,您经常会覆盖web.config。在IIS,当您更改信任设置的东西比默认不同,您的网络配置部分修饰:

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

复制过程中部署往往覆盖此设置一个新的web.config文件,但是IIS管理仍将显示该网站称为“完全信任”,实际上该网站运行在无论您的共享主机提供商(通常是中等)的默认信任级别。

你会看到这个错误,做什么我没有 - 揣摩为什么你会看到它,即使你知道该网站是在完全信任运行,当在现实中,事实并非如此。解决方案是在部署之前修改您的web配置,或者使用IIS Admin将站点设置为不同的信任级别(例如高),应用它,然后将其设置回满。这样做会重新插入必要的配置文件信息并以完全信任的方式重新启动应用程序池。

[assembly: System.Security.AllowPartiallyTrustedCallers] 

删除它解决了我的问题,而无需切换到SecurityRuleSet.Level1:

17

当我打电话说有AllowPartiallyTrustedCallers属性的组件有这个问题。

+0

为了编译DevExpress源代码,这是一个快速且脏的修补程序。 – 2013-05-29 23:52:18

+4

这将包含在AssemblyInfo.cs中,至少对我来说是这样。摆脱它解决了它对我来说也是如此。 – 2014-08-01 19:32:49

1

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

旁白:也许我没有按照最佳做法将库包括在我的项目中。如果是这样的话,我会欢迎不同方式的反馈,以及每个选择的利弊。我目前的想法是,如果出现错误,能够看到图书馆的源代码将帮助我了解图书馆期望的内容,这将帮助我清除错误。另外,看到其他人如何编写源代码是没有价值的学习经验。基本上,我试图按照Jeff Atwood的建议发现here。但是如果有更好的方法来实现这一目标,我就会全神贯注。

相关问题