但是在我将Winforms应用程序中的27个项目更改为.NET 4并重新编译后,在启动应用程序时,我得到了
System.TypeLoadException was unhandled
Message=Inheritance security rules violated while overriding member:
‘MyCustomORM.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.
嗯…..
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....... } } }
但这并没有改变任何事情…..
甚至在我的静态Main()方法中的第一行代码到达之前就发生异常….
我已经梳理了整个项目并删除了对旧.NET 1.1库的任何引用(是的,该应用程序是旧的…..)并用它们的.NET 4对应物(主要是log4net)替换它们.还是没有运气……
有任何想法吗??
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.