我有一个继承自Exception的类。在.NET 4中,我开始收到运行时错误:
违反了继承安全规则 覆盖成员时:MyBusinessException.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)'。安全 覆盖方法的可访问性 必须与安全性可访问性相匹配 被覆盖的方法。
我认为这个问题是由于我正在重写GetObjectData。
我知道解决问题的一个答案是设置SecurityRuleSet:
[assembly: SecurityRules(SecurityRuleSet.Level1)]
这不是一个可接受的答案,我想知道如何解决问题,而不必放松.NET 4中的默认安全规则。
答案 0 :(得分:35)
将GetObjectData
标记为SecurityCriticalAttribute
,因为它已应用于Exception.GetObjectData
。被覆盖的成员应具有相同的安全可访问性(严重,安全关键或透明)。
有关详细信息,请阅读MSDN中的Security Changes in the .NET Framework 4和Security Transparent Code, Level 2。
要避免所有潜在的安全运行时异常,请使用安全规则集启用代码分析。您将收到可能与运行时错误相对应的静态分析警告。
答案 1 :(得分:20)
当我调用具有AllowPartiallyTrustedCallers属性的程序集时出现此问题:
[assembly: System.Security.AllowPartiallyTrustedCallers]
删除它解决了我的问题,而没有切换到SecurityRuleSet.Level1。
答案 2 :(得分:11)
关于允许完全信任应用程序的共享托管环境中的此错误。在bin部署应用程序时,通常会覆盖web.config。在IIS下,当您将信任设置更改为不同于默认值的设置时,您的Web配置部分将修改为:
<system.web>
<trust level="Full" />
<system.web>
在部署期间复制新的web.config通常会覆盖此设置,但IIS管理员仍会将该网站显示为“完全信任”,而实际上该网站正在运行的默认信任级别为您的共享主机提供商(通常是中等)。
您将看到此错误并执行我所做的操作 - 即使您知道该网站在完全信任下运行,也要弄清楚为什么会看到它,而实际上并非如此。解决方案是在部署之前修改您的Web配置,或者使用IIS Admin将站点设置为不同的信任级别(例如,高),应用它,然后将其重新设置为完全。这样做会重新插入必要的配置文件信息,并完全信任地重新启动应用程序池。
答案 3 :(得分:1)
对我来说,问题出在log4net库上。我下载了源代码,并将项目文件添加到我的解决方案中,以便我可以进入外部库。但是,log4net需要为条件编译定义的NET_4_0
符号。默认情况下,已定义NET_1_0
。我进入了log4net项目属性并将NET_1_0
更改为NET_4_0
,这解决了这个问题。
旁白:也许我没有通过在我的项目中包含库来遵循最佳实践。如果是这种情况,我会欢迎有关不同方法的反馈,以及每种选择的利弊。我目前的想法是,如果有错误,能够看到库的源代码将帮助我理解库的期望,这将帮助我清除错误。此外,看看其他人如何编写源代码,如果不是有价值的学习经验,那就没什么。基本上,我试图遵循Jeff Atwood的建议here。但是,如果有更好的方法来实现这一目标,我会全力以赴。
答案 4 :(得分:0)
我遇到了这个错误,这对我的情况毫无意义! 我使用了一个简单的示例https://www.c-sharpcorner.com/article/using-autofac-with-web-api
问题是我没有空间,也没有注意到它,所以我通过在驱动器上腾出空间来解决了这个问题。
也许这可以节省一些人的无用调查时间。