【问题标题】:System.TypeLoadException was unhandled / Inheritance security rules violated while overriding memberSystem.TypeLoadException 未处理/覆盖成员时违反了继承安全规则
【发布时间】:2023-04-01 05:20:01
【问题描述】:

你能不能为你的应用创建一个 .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)。还是没有运气......

有什么想法吗??

【问题讨论】:

  • 有一个“标志”来控制这种行为。虽然不记得在哪里。该错误还表明您不能在那里使用virtual
  • 另外,GetObjectData 在抽象类中没有真正意义,因为您永远无法重新实例化它(到抽象类型的实例)。

标签: winforms .net-4.0 code-access-security


【解决方案1】:

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

【讨论】:

  • 所有程序集似乎都有一个属性[assembly: AllowPartiallyTrustedCallers]
  • 在 2 级规则下,APTCA 会导致程序集中的所有代码都被视为透明,除非标记为关键代码。通过 SecurityRulesAttribute 指定 1 级规则应该可以解决您的直接问题,就像您使用 SecurityTransparentAttribute 一样。
【解决方案2】:

我知道这已经很老了,但我最近在我的一个程序集中遇到了这个问题。它只发生在某些机器上,很难确定是什么原因造成的。我不只是想调整安全规则,所以经过大量搜索后,我发现了 Visual Studio 中包含的 SecAnnotate 工具。

Using SecAnnotate to Identify Transparency Violations

使用该工具,我能够确定我的一个程序集引用了旧版本的 dll,其中包含一些导致问题的安全属性。更新参考解决了这个问题。

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

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-29
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多