我有一个相对稳定的服务器应用程序版本,已经在数十个客户端部署了近一年。
最近有一个新客户设置了该应用程序,并出现了以下错误:
System.MethodAccessException: 安全透明方法 [SomeMethod] 试图访问安全关键方法 [SomeOtherMethod] 失败。
SomeMethod和SomeOtherMethod都是我编写的程序集中的方法,构建于.NET 4,并在Windows服务内运行。如果有区别的话,SomeOtherMethod确实引用了第三方程序集(EntLib 4.1)中构建于.NET 2.0的类型。查看EntLib 4.1的代码时,我确实看到他们使用了SecurityTransparent和APTC属性,但这从未在其他客户端中引起过问题。
这些程序集已经从.NET 2.0 CLR升级,但很久以前就完成了。这段精确的代码在其他客户端上运行得很好,而且我在任何地方都没有显式地使用APTC属性或SecurityCritical属性。
这使我得出结论,这可能是一个配置问题,或者是.NET Framework补丁问题。是否发布了.NET的补丁,会导致此破坏性变化?是否有某个配置设置可以强制执行此类型的检查,默认情况下关闭但我的客户端可能已经启用了?
最后一点,我的服务利用SSRS RDLC生成PDF。由于.NET 4中的一些更改,我必须通过以下配置强制服务使用传统的安全策略:
<runtime>
<NetFx40_LegacySecurityPolicy enabled="true" />
</runtime>
要了解我为什么需要这样做的更多细节,请参阅此stackoverflow帖子:Very High Memory Usage in .NET 4.0
重要的是,我在所有其他客户端都执行此操作。只有这一个客户端存在问题。