Winforms 重写成员时未处理System.TypeLoadException/违反继承安全规则

Winforms 重写成员时未处理System.TypeLoadException/违反继承安全规则,winforms,.net-4.0,code-access-security,Winforms,.net 4.0,Code Access Security,你能为你的应用程序创建一个.NET4版本进行测试吗?这是老板们天真的问题——当然 但在我将Winforms应用程序中的27个项目更改为.NET4并重新编译后,当启动该应用程序时,我得到了 系统。TypeLoadException未处理 Message=重写成员时违反了继承安全规则: 'MyCustomORM.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.Strea

你能为你的应用程序创建一个.NET4版本进行测试吗?这是老板们天真的问题——当然

但在我将Winforms应用程序中的27个项目更改为.NET4并重新编译后,当启动该应用程序时,我得到了

系统。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()
方法中的第一行代码之前,也会发生异常

我已经梳理了整个项目,删除了对旧的.NET1.1库的任何引用(是的,应用程序就是这么旧的…),并用它们的.NET4对应项(主要是log4net)替换它们。还是不走运


有什么想法吗?

MyCustomORM类所在的程序集是否用SecurityTransparentAttribute标记?如果是这样,那么问题源于.NET3.5和.NET4.0之间的安全透明模型的变化。对于您的测试场景,您可能希望简单地选择使用旧的透明机制。为此,请添加以下程序集级别属性:

[assembly: SecurityRules(SecurityRuleSet.Level1)]

有关Level1和Level2透明度模型之间差异的更多信息,请参阅。

我知道这已经很旧了,但最近我的一个程序集遇到了这个问题。它只发生在一些机器上,很难确定是什么导致了它。我不只是想调整安全规则,所以在进行了大量搜索之后,我找到了VisualStudio附带的SecAnnotate工具

使用该工具,我能够确定我的一个程序集引用了一个较旧版本的dll,该dll包含一些导致问题的安全属性。更新引用修复了该问题

SecAnnotate工具似乎是一个很好的方法,可以识别您可能意外忽略或不知道的任何违规行为


希望这对某人有所帮助。

有一个“标志”来控制这种行为。但我想不起来在哪里。该错误还表明您不能在那里使用
virtual
。此外,
GetObjectData
在抽象类中没有实际意义,因为您永远无法将其重新实例化(到抽象类型的实例)。所有程序集似乎都有一个属性
[程序集:AllowPartiallyTrustedCallers]
根据2级规则,APTCA会导致程序集中的所有代码被视为透明的,除非标记为关键代码。通过SecurityRulesAttribute指定级别1规则应该可以解决您眼前的问题,就像您使用了SecurityTransparentAttribute一样。