Загрузить сборку в AppDomain

если я использую

Assembly assembly = Assembly.LoadFrom(file);

а позже попытаюсь использовать файл, я получаю исключение о том, что файл уже используется.

мне нужно загрузить его в новый домен приложения.

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

мне нужно:

 (1) load the assembly into a new AppDomain from a file . 
 (2) extract an embedded  resource (xml file) from the Dll .
 (3) extract a type of class which implements an interface (which i know the interface type) .
 (4) unload the entire appdomain in order to free the file .  

2–4 - это не проблема

Я просто не могу найти, как загрузить сборку в новый AppDomin, только примеры создания экземпляра, который дает мне экземпляр класса из с в Dll.

мне нужно все.

как в этом вопросе: еще один пример создания экземпляра.

Загрузка библиотек DLL в отдельный домен приложений


person eran otzap    schedule 25.04.2012    source источник
comment
просматривали ли вы msdn.microsoft.com/en-us/library/25y1ya39. aspx ??   -  person rt2800    schedule 25.04.2012
comment
Может, этот ответ может вам помочь? stackoverflow.com/a/225355/747511   -  person Jan-Peter Vos    schedule 25.04.2012


Ответы (1)


Самый простой мультидоменный сценарий:

static void Main()
{
    AppDomain newDomain = AppDomain.CreateDomain("New Domain");
    newDomain.ExecuteAssembly("file.exe");
    AppDomain.Unload(newDomain);
}

Вызов ExecuteAssembly в отдельном домене удобен, но не дает возможности взаимодействовать с самим доменом. Это также требует, чтобы целевая сборка была исполняемым файлом, и вынуждает вызывающего объекта использовать единственную точку входа. Чтобы обеспечить некоторую гибкость, вы также можете передать строку или аргументы в .exe.

Надеюсь, это поможет.

Расширение: попробуйте следующее:

AppDomainSetup setup = new AppDomainSetup();
setup.AppDomainInitializer = new AppDomainInitializer(ConfigureAppDomain);
setup.AppDomainInitializerArguments = new string[] { unknownAppPath };
AppDomain testDomain = AppDomain.CreateDomain("test", AppDomain.CurrentDomain.Evidence, setup);
AppDomain.Unload(testDomain);
File.Delete(unknownAppPath);

где AppDomain может быть инициализирован следующим образом

public static void ConfigureAppDomain(string[] args)
{
    string unknownAppPath = args[0];
    AppDomain.CurrentDomain.DoCallBack(delegate()
    {
        //check that the new assembly is signed with the same public key
        Assembly unknownAsm = AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(unknownAppPath));

        //get the new assembly public key
        byte[] unknownKeyBytes = unknownAsm.GetName().GetPublicKey();
        string unknownKeyStr = BitConverter.ToString(unknownKeyBytes);

        //get the current public key
        Assembly asm = Assembly.GetExecutingAssembly();
        AssemblyName aname = asm.GetName();
        byte[] pubKey = aname.GetPublicKey();
        string hexKeyStr = BitConverter.ToString(pubKey);
        if (hexKeyStr == unknownKeyStr)
        {
            //keys match so execute a method
            Type classType = unknownAsm.GetType("namespace.classname");
            classType.InvokeMember("MethodNameToInvoke", BindingFlags.InvokeMethod, null, null, null);
        }
    });
}
person MoonKnight    schedule 25.04.2012