中程度の信頼で実行され、完全な信頼が必要な場合に失敗する自動テストを作成したいと考えています。
一部の機能が完全な信頼のシナリオでのみ使用できるライブラリを作成しており、中程度の信頼で実行したいコードが正常に動作することを確認したいと考えています。完全な信頼を必要とするクラスを変更すると、テストが失敗することも知りたい場合。
別の AppDomain を作成し、信頼度が中程度の PolicyLevel を読み込もうとしましたが、クロス AppDomain コールバックを実行しようとすると、常にアセンブリでエラーが発生するか、その依存関係を読み込めませんでした。
これを取り除く方法はありますか?
更新:返信に基づいて、これが私が持っているものです。テストするクラスは 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 );
}
}
}