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

mar*_*c_s 5 .net-4.0 code-access-security winforms

你可以创建一个.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.......
    }
}
Run Code Online (Sandbox Code Playgroud)

而且我还有两个派生自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.......
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

但这并没有改变任何事情.....

甚至在我的方法中的第一行代码static Main()到达之前就发生了异常....

我已经梳理了整个项目并删除了对旧.NET 1.1库的任何引用(是的,该应用程序是旧的.....)并用它们的.NET 4对应物(主要是log4net)替换它们.还是没有运气......

有任何想法吗??

Nic*_*oiu 6

MyCustomORM类所在的程序集是否标有SecurityTransparentAttribute?如果是这样,问题源于.NET 3.5和.NET 4.0之间的安全透明度模型的变化.对于您的测试场景,您可能希望选择使用较旧的透明机制.为此,请添加以下程序集级属性:

[assembly: SecurityRules(SecurityRuleSet.Level1)]
Run Code Online (Sandbox Code Playgroud)

有关Level1和Level2透明度模型之间差异的更多信息,请参阅http://blogs.msdn.com/b/shawnfa/archive/2009/11/12/differences-between-the-security-rule-sets.aspx.