Я хотел бы написать автоматические тесты, которые выполняются со средним уровнем доверия и дают сбой, если они требуют полного доверия.
Я пишу библиотеку, в которой некоторые функции доступны только в сценариях полного доверия, и я хочу убедиться, что код, который я хочу запустить при среднем доверии, будет работать нормально. Если вы также хотите знать, что если я изменю класс, требующий полного доверия, мои тесты не пройдут.
Я попытался создать еще один 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 );
}
}
}