C # appDomain не работает по причине «CodeAccessPermission», почему? - PullRequest
1 голос
/ 09 июня 2019

Я пробую C # appdomain на win10, используя vs2017, у меня есть этот быстрый пример.У меня есть каталог c: \ git, я могу создавать файлы в этом каталоге с приложением C #, но когда я пробовал домен приложения, он выдает исключение, мой код, как показано ниже:

class UseAppDomain
{
    public static void Test()
    {
        var perm = new PermissionSet(PermissionState.None);
        perm.AddPermission(
            new SecurityPermission(SecurityPermissionFlag.Execution));
        perm.AddPermission(
            new FileIOPermission(FileIOPermissionAccess.NoAccess, @"c:\"));

        var setup = new AppDomainSetup();
        setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
        AppDomain secureDomain = AppDomain.CreateDomain("secure", null, setup, perm);

        ThirdParty third = new ThirdParty();

        Type thirdParty = typeof(ThirdParty);
        secureDomain.
            CreateInstanceAndUnwrap(thirdParty.Assembly.FullName,
                thirdParty.FullName);  //exception!!!!!!!!!!
        AppDomain.Unload(secureDomain);
    }
}

[Serializable]
class ThirdParty
{
    public ThirdParty()
    {
        Console.WriteLine("3p loadling");
        System.IO.File.Create(@"c:\git\test.txt");//Try to create file failed!
    }
}

Сообщение об исключенииis:

Unhandled Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
at System.Security.CodeAccessSecurityEngine.Check(CodeAccessPermission cap, StackCrawlMark& stackMark)
at System.Security.CodeAccessPermission.Demand()
... ...

Я не совсем понимаю, с какой проблемой связана моя программа, как решить эту проблему?

Спасибо.

1 Ответ

1 голос
/ 09 июня 2019

Если вы хотите создать файлы из частично доверенного домена, вам нужно использовать FileIOPermissionAccess.Write. Или FileIOPermissionAccess.AllAccess, если вы хотите разрешить чтение и обнаружение содержимого каталога.

Примечание:

Вы используете CreateInstanceAndUnwrap для простого сериализуемого класса, который не является производным от MarshalByRefObject. Это приводит к тому, что класс будет сериализован в созданном домене, а копия будет десериализована в основном домене, но если вы не укажете возвращаемое значение, оно все равно будет удалено.

Так что либо не разворачивайте созданный объект, либо не извлекайте его из класса MarshalByRefObject, чтобы его открытые члены могли быть доступны из основного домена с помощью удаленного взаимодействия.

...