【发布时间】: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