@CQ: Почему Вы создаете локальный pf Jump
копии? Кроме того, можно сохранить последующий тест путем небольшого изменения объявления события:
public event EventHandler Jump = delegate { };
public void OnJump()
{
Jump(this, EventArgs.Empty);
}
Я никогда не пытался это сделать, но в целом для обработки сбоев загрузки сборок из пользовательских доменов приложений можно использовать событие AppDomain.AssemblyResolve.
Хотя это совершенно не связано, вот ] пример использования AppDomain.AssemblyResolve .
Ответ зависит от того, что делает ваш код, когда кто-то со средним уровнем доверия пытается получить доступ к функции полного доверия. Я предполагаю, что будет сгенерировано какое-то исключение.
В этом случае напишите модульный тест, который работает в контексте среднего доверия, пытается получить доступ к функции полного доверия и ожидает возникновения исключения. Если вы никогда не писали подобный тест, один из распространенных способов его выполнения, поддерживаемых большинством фреймворков тестирования, заключается в следующем:
testMediumTrustUserWontAccessFeatureX()
{
// set up the context of your test ...
try
{
accessFullTrustFeature();
fail("Test failed - Medium trust user can access full trust feature");
}
catch( SomeKindOfException e )
{
// Success - feature was denied to the untrusted user
}
}
Если исключение обнаружено, это означает, что ваш ненадежный пользователь не получил доступа к функции (и тест проходит), но если исключение не обнаруживается, тест завершается неудачно (мы ожидали исключения и не получили его).
Это псевдокод в стиле Java, но этот шаблон должен работать на любом языке, который вы используете, предполагая он поддерживает обработку исключений.
Бесстыдно украдено из Как разместить песочницу с частичным доверием - # 7 , но повторно реализовано (вместе с простым тестовым примером) на F # только для кайф: -)
open System
open System.Reflection
open System.Security
open System.Security.Permissions
open System.Security.Policy
type Program() =
inherit System.MarshalByRefObject()
member x.PartialTrustSuccess() =
Console.WriteLine("foo")
member x.PartialTrustFailure() =
let field = typeof<Int32>.GetField("m_value", BindingFlags.Instance ||| BindingFlags.NonPublic)
let value = field.GetValue(1)
Console.WriteLine("value: {0}", value)
[<EntryPoint>]
let main _ =
let appDomain =
let setup = AppDomainSetup(ApplicationBase = AppDomain.CurrentDomain.BaseDirectory)
let permissions = PermissionSet(null)
permissions.AddPermission(SecurityPermission(SecurityPermissionFlag.Execution)) |> ignore
permissions.AddPermission(ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess)) |> ignore
AppDomain.CreateDomain("Partial Trust AppDomain", null, setup, permissions)
let program = appDomain.CreateInstanceAndUnwrap(
typeof<Program>.Assembly.FullName,
typeof<Program>.FullName) :?> Program
program.PartialTrustSuccess()
try
program.PartialTrustFailure()
Console.Error.WriteLine("partial trust test failed")
with
| :? FieldAccessException -> ()
0
И версия C #:
using System;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
using System.Security.Policy;
namespace PartialTrustTest
{
internal class Program : 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);
}
private static AppDomain CreatePartialTrustDomain()
{
AppDomainSetup setup = new AppDomainSetup() { ApplicationBase = AppDomain.CurrentDomain.BaseDirectory };
PermissionSet permissions = new PermissionSet(null);
permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
permissions.AddPermission(new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess));
return AppDomain.CreateDomain("Partial Trust AppDomain", null, setup, permissions);
}
static void Main(string[] args)
{
AppDomain appDomain = CreatePartialTrustDomain();
Program program = (Program)appDomain.CreateInstanceAndUnwrap(
typeof(Program).Assembly.FullName,
typeof(Program).FullName);
program.PartialTrustSuccess();
try
{
program.PartialTrustFailure();
Console.Error.WriteLine("!!! partial trust test failed");
}
catch (FieldAccessException)
{
Console.WriteLine("partial trust success #2");
}
}
}
}
C:\temp\PartialTrustTest\bin\Debug>PartialTrustTest.exe partial trust success #1 partial trust success #2