我希望编写自动化测试,能够在中等信任级别下运行,并且如果需要完全信任就会失败。
我正在编写一个库,其中某些功能仅在完全信任的情况下才可用,并且我想验证我希望在中等信任级别下运行的代码是否可以正常工作。如果我更改需要完全信任的类,也想知道我的测试是否会失败。
我尝试创建另一个应用程序域并加载中等信任策略级别,但是在尝试运行跨应用程序域回调时,我总是会出现程序集或其依赖项无法加载的错误。
有没有办法解决这个问题?
更新:根据回复,这是我所拥有的内容。请注意,您要测试的类必须扩展MarshalByRefObject。这非常有限,但我看不到其他解决方法。
我正在编写一个库,其中某些功能仅在完全信任的情况下才可用,并且我想验证我希望在中等信任级别下运行的代码是否可以正常工作。如果我更改需要完全信任的类,也想知道我的测试是否会失败。
我尝试创建另一个应用程序域并加载中等信任策略级别,但是在尝试运行跨应用程序域回调时,我总是会出现程序集或其依赖项无法加载的错误。
有没有办法解决这个问题?
更新:根据回复,这是我所拥有的内容。请注意,您要测试的类必须扩展MarshalByRefObject。这非常有限,但我看不到其他解决方法。
using System;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
using Xunit;
namespace PartialTrustTest
{
[Serializable]
public class ClassUnderTest : MarshalByRefObject
{
public void PartialTrustSuccess()
{
Console.WriteLine( "partial trust success #1" );
}
public void PartialTrustFailure()
{
FieldInfo fi = typeof (Int32).GetField( "m_value", BindingFlags.Instance | BindingFlags.NonPublic );
object value = fi.GetValue( 1 );
Console.WriteLine( "value: {0}", value );
}
}
public class Test
{
[Fact]
public void MediumTrustWithExternalClass()
{
// ClassUnderTest must extend MarshalByRefObject
var classUnderTest = MediumTrustContext.Create<ClassUnderTest>();
classUnderTest.PartialTrustSuccess();
Assert.Throws<FieldAccessException>( classUnderTest.PartialTrustFailure );
}
}
internal static class MediumTrustContext
{
public static T Create<T>()
{
AppDomain appDomain = CreatePartialTrustDomain();
var t = (T) appDomain.CreateInstanceAndUnwrap( typeof (T).Assembly.FullName, typeof (T).FullName );
return t;
}
public static AppDomain CreatePartialTrustDomain()
{
var setup = new AppDomainSetup {ApplicationBase = AppDomain.CurrentDomain.BaseDirectory};
var permissions = new PermissionSet( null );
permissions.AddPermission( new SecurityPermission( SecurityPermissionFlag.Execution ) );
permissions.AddPermission( new ReflectionPermission( ReflectionPermissionFlag.RestrictedMemberAccess ) );
return AppDomain.CreateDomain( "Partial Trust AppDomain: " + DateTime.Now.Ticks, null, setup, permissions );
}
}
}