Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > AppDomain и System.Security???


Автор: HerrOberst 24.8.2008, 17:42
Уже совсем запарился с AppDomain ну ни как не могу загрузить сборку(DLL) в домен, чего только не пробовал  smile 
всегда выдает ошибку:

Сбой при запросе разрешения типа "System.Security.Permissions.SecurityPermission.....
Я так понимаю, что это связано с политикой безопасности.

Может, кто сможет объяснить чего делать надо. И главное как!
(Использую загрузку через домен, так как потом надо ету сборку выгрузить.)

Для наглядности приведу одну из моих попыток:
Код

string sLocation = "D:\File1.dll";
string sClassName = "Class1";

AppDomain appDomain = AppDomain.CreateDomain("Domain");

object copyClass = appDomain.CreateInstanceAndUnwrap(sLocation , sClassName)

Type copyClassType = copyClass.GetType();
//А далее переменную copyClassType уже использую для работы со сборкой - ета уже проверено



Автор: mullih 24.8.2008, 20:10
Попробуй изменить
Код

string sLocation = "D:\File1.dll";


на

Код

string sLocation = "D:\\File1.dll";


или

Код

string sLocation = @"D:\File1.dll";


если не в этом дела покажи если возможно дллельку

Автор: HerrOberst 25.8.2008, 08:48
mullih, не с этим проблем нету, - это я так по памяти для наглядности код ввел, ну и обшипся малость  smile (реальный код слишком здоровый.....)

Может просто у кого-нибудь тоже проблемы с загрузкой сборок в домен были. Связанные с политикой безопасности, и как это разрешилось?

Автор: HerrOberst 25.8.2008, 10:37
mullih, 
Цитата

если не в этом дела покажи если возможно дллельку


Dll:
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

    public class Class1
    {
        public static string BookmakerName
        {
            get 
            {
               return "Марафон";
            }
            set {}
        }

        public static string BookmakerNameUrl
        {
            get
            {
                return "www.marathonbet.com";
            }
            set { }
        }
    }

Автор: mullih 26.8.2008, 14:25
С AppDomain.CreateInstanceAndUnwrap не получилось. На сколько я понял там объект подымается используя прокси со своими заморочками, когдато сам мачался с этим, да и класс должен наследоватся от MarshalByRefObject. Но это уже к гуру Net Remoting. 

Как альтарнатива могу предложить решение без создания домена.

Код

            string sLocation = @"D:\Temp\123\ClassLibrary1\ClassLibrary1\bin\Debug\Lib.dll";
            string sClassName = "Class1";
            Assembly assembly = Assembly.LoadFile(sLocation);

            //тип нашего класса в дллельке
            Type copyClassType = assembly.GetType(sClassName);

            //собственно наш объект если надо
            object obj = Activator.CreateInstance(copyClassType);

            //получаем Property of BookmakerName, as example
            object result = copyClassType.InvokeMember("BookmakerName", BindingFlags.GetProperty, null, null, new object[] { });

            Console.WriteLine(result);
            Console.ReadKey();


Автор: HerrOberst 26.8.2008, 14:39
mullih,  спосибо, - это ясно  smile 

Вся проблема в том, что сборку надо будет потом выгрузить, а насколько я знаю - это можно сделать только сначала загрузив сборку в домен, а потом выгрузив этот домен целиком.

Других вариантов - вроде как нету, если конечно не парится с WinAPI

Автор: mullih 26.8.2008, 15:46
Ну коль все так плохо тогда лови  smile 

Код

//Our Console Application

class Example
{
    public static void Main()
    {
        string assemblyName = "ClassLibrary1";

        AppDomainSetup mySetupInfo = new AppDomainSetup();

//dll лежит в папке приложения (не проверял с другими путями (няма часу играться, сори))
        mySetupInfo.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
        mySetupInfo.ApplicationName = assemblyName;
        mySetupInfo.LoaderOptimization = LoaderOptimization.SingleDomain;

        AppDomain myDomain = AppDomain.CreateDomain(assemblyName, null, mySetupInfo);

        Object obj = myDomain.CreateInstanceAndUnwrap(assemblyName, "Worker", false, BindingFlags.Public | BindingFlags.CreateInstance | BindingFlags.Instance, null, null, null, null, null);

        Type objType = obj.GetType();

        objType.InvokeMember("PrintDomain", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, obj, new object[] {});

        object result = objType.InvokeMember("BookmakerName", BindingFlags.GetProperty, null, null, new object[] { });

        Console.WriteLine(result);

        Console.ReadKey();
    }
}


Код

//Our Dll with assembly name "ClassLibrary1"
//на счет Serializable не помню где он надо а где нет но вроде он обязателен когда маршалин по значению идет
//абявазкова указываем маршалинг
[Serializable]
public class Worker : MarshalByRefObject
{
    public void PrintDomain()
    {
        Console.WriteLine("Object is executing in AppDomain \"{0}\"",
                AppDomain.CurrentDomain.FriendlyName);
    }

    public static string BookmakerName
    {
        get
        {
            return "Марафон";
        }
        set { }
    }
}


Автор: HerrOberst 3.10.2008, 09:51
Особая благодарность mullih, 
Для тех кому интересно привожу:
http://forum.chertenok.ru/viewtopic.php?t=7924&highlight= проблемы загрузки сборки в новый домен по адрсесу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)