我有一个标有 的程序集,AllowPartiallyTrustedCallersAttribute
其中包含一个自定义异常类。我想通过覆盖使其可序列化GetObjectData
。
随着 .NET 4,GetObjectData
已经成为一种SecurityCritical
方法。这意味着覆盖也需要是SecurityCritical
. 由于我的程序集标有,因此除非另有说明,否则其中的AllowPartiallyTrustedCallersAttribute
所有代码都是自动的。SecurityTransparent
因此,我将 应用于SecurityCriticalAttribute
GetObjectData 覆盖:
using System;
using System.Runtime.Serialization;
using System.Security;
[assembly:AllowPartiallyTrustedCallers]
namespace Library
{
[Serializable]
public class MyException : Exception
{
public string String;
public MyException ()
{
}
protected MyException (SerializationInfo info, StreamingContext context)
: base(info, context)
{
String = info.GetString ("String");
}
[SecurityCritical]
public override void GetObjectData (System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
{
info.AddValue ("String", String);
base.GetObjectData (info, context);
}
}
}
这在完全信任的情况下工作得很好,例如,当我从我的桌面运行链接这个程序集的代码时。
但是,当我从安全沙箱(见下文)使用此类时,我得到TypeLoadException
:
覆盖成员时违反了继承安全规则:'Library.MyException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'。重写方法的安全可访问性必须与被重写方法的安全可访问性相匹配。
我的问题:
- 为什么我会收到此异常?我确实将覆盖标记为
SecurityCritical
,那么问题出在哪里? - 由于
SecurityCriticalAttribute
在我的沙箱中被忽略,此类在其他部分信任主机(例如 IIS/ASP.NET 或 SQL Server)中将如何表现? - 如何在 .NET 4 中实现可序列化的异常类?
沙盒代码:
var evidence = new Evidence();
evidence.AddHostEvidence (new Zone (SecurityZone.Internet));
var setupInfo = AppDomain.CurrentDomain.SetupInformation;
var permissionSet = SecurityManager.GetStandardSandbox (evidence);
permissionSet.AddPermission (new ReflectionPermission (ReflectionPermissionFlag.MemberAccess));
permissionSet.AddPermission (new SecurityPermission (SecurityPermissionFlag.ControlEvidence));
var sandbox = AppDomain.CreateDomain ("Sandbox", evidence, setupInfo, permissionSet);