您是否可以创建用于测试的应用程序的.NET 4版本是老板无辜的问题 - 当然!
但在我将Winforms应用程序中的27个项目更改为.NET 4并重新编译后,在启动应用程序时,我得到了
System.TypeLoadException 未处理 Message = 覆盖成员时违反了继承安全规则: 'MyCustomORM.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)'。 覆盖方法的安全性可访问性必须与被覆盖方法的安全性可访问性相匹配。
嗯......
MyCustomORM
确实实现了ISerializable
接口,因此具有此方法
[Serializable]
public abstract class MyCustomORM: IMyCustomORM, ISerializable, ICloneable, ISecurable
{
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
// do stuff here.......
}
}
我还有两个派生自Exception
的类,它们会覆盖GetObjectData
方法。
但这可能是错的?谷歌搜索我发现了一些额外的属性,以坚持我的方法和命名空间 - 所以我做了:
[assembly: SecurityPermission(SecurityAction.RequestMinimum, Execution = true)]
namespace MyApplication.ORM
{
[Serializable]
public abstract class MyCustomORM: IMyCustomORM, ISerializable, ICloneable, ISecurable
{
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
// do stuff here.......
}
}
}
但这并没有改变任何事情......
甚至在我的static Main()
方法中的第一行代码到达之前就发生了异常....
我已经梳理了整个项目,并删除了对旧.NET 1.1库的任何引用(是的,该应用程序是旧的.....)并用它们的.NET 4对应物(主要是log4net)替换它们。仍然没有运气......
任何想法??
答案 0 :(得分:6)
MyCustomORM类所在的程序集是否标有SecurityTransparentAttribute?如果是这样,问题源于.NET 3.5和.NET 4.0之间的安全透明度模型的变化。对于您的测试场景,您可能希望选择使用较旧的透明机制。为此,请添加以下程序集级属性:
[assembly: SecurityRules(SecurityRuleSet.Level1)]
有关Level1和Level2透明度模型之间差异的更多信息,请参阅http://blogs.msdn.com/b/shawnfa/archive/2009/11/12/differences-between-the-security-rule-sets.aspx。
答案 1 :(得分:1)
我知道这已经很老了,但我最近遇到了这个问题。它只发生在某些机器上,很难确定导致它的原因。我不仅仅想要进行安全规则调整,因此经过多次搜索后,我遇到了Visual Studio附带的SecAnnotate工具。
Using SecAnnotate to Identify Transparency Violations
使用该工具,我能够确定我的一个程序集引用了一个旧版本的dll,其中包含一些导致问题的安全属性。更新参考修复了问题。
SecAnnotate工具似乎是识别您可能偶然忽略或不知道的任何违规行为的好方法。
希望这有助于某人。