当前位置 : 主页 > 手机开发 > 其它 >

winforms – 在覆盖成员时未处理System.TypeLoadException /违反继承安全规则

来源:互联网 收集:自由互联 发布时间:2021-06-19
你可以创建一个.NET 4版本的应用程序进行测试是老板的无辜问题 – 当然! 但是在我将Winforms应用程序中的27个项目更改为.NET 4并重新编译后,在启动应用程序时,我得到了 System.TypeLoadEx
你可以创建一个.NET 4版本的应用程序进行测试是老板的无辜问题 – 当然!

但是在我将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.

网友评论