Заредете независимо сглобяване в домейн на друго приложение

прост въпрос, вероятно лесен за отговор.

Имам dll с име "MigrationSteps.dll" в същата изходна папка на моето приложение. Това, което искам да направя, е да заредя тази сглобка в нов AppDomain и да изпълня метод на екземпляр на клас вътре в тази DLL.

Ето моя код

       string migrationStepsDllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "MigrationSteps.dll");
        AppDomainSetup appDomainSetup = new AppDomainSetup() { PrivateBinPath = AppDomain.CurrentDomain.BaseDirectory };
        Evidence evidence = AppDomain.CurrentDomain.Evidence;

        AppDomain appDomain = AppDomain.CreateDomain("MigrationAppDomain", evidence, appDomainSetup);

 //NOT WORKING
        Assembly assembly = appDomain.Load(@"C:\Output\Debug\OptimeToolbench\MigrationSteps.dll");

        //WORKING
        Assembly assembly = Assembly.LoadFrom(@"C:\Output\Debug\OptimeToolbench\MigrationSteps.dll"); ****works.

        //This part works well
        Type type = assembly.GetType("MigrationSteps.Foo");
        object foo = Activator.CreateInstance(type);
        MethodInfo methodInfo = type.GetMethod("HelloWorld");
        methodInfo.Invoke(foo, null);
        AppDomain.Unload(appDomain);

Всеки път, когато линията, посочена като неработеща, хвърля a

FileNotFoundException

.

Защо така ?

Благодаря за отделеното време.


person esylvestre    schedule 28.06.2010    source източник
comment
Можете ли да активирате Fusion регистратора и да видите какво търси първият и къде?   -  person Preet Sangha    schedule 29.06.2010
comment
Няма да е необходимо, решението беше отговорът. Благодаря за отделеното време.   -  person esylvestre    schedule 29.06.2010
comment
Само искам да отбележа, че този код ще се зареди в основния AppDomain и ще заключи целевия модул за целия живот на приложението. За да предотвратите това (и действително да разтоварите целта), трябва да създадете прокси обект, който се зарежда динамично, зарежда динамично целта (този код) и накрая след това разбърква сериализируемите данни (ако е необходимо) обратно към извикващото приложение.   -  person JoeBrockhaus    schedule 06.12.2014


Отговори (2)


Добавете "C:\Output\Debug\OptimeToolbench\" към PrivateBinPath на AppDomain. Също така не предавайте името на файла, предавайте името на сборката -- предполагам, че това ще бъде MigrationSteps.

person code4life    schedule 29.06.2010
comment
Вече сте готови (за PrivateBinPath), вижте ред #2. Но също така беше прав, благодаря ти много. - person esylvestre; 29.06.2010

appDomain.Load(string) приема име на асемблира (силното име) - НЕ пътя до мястото, където се намира файлът на диска!

person Robert Seder    schedule 28.06.2010
comment
+1. Предполагам, че очаква показваното име на сглобката, което може или не може да бъде пълно силно име - но вие сте прав, няма да приеме път. - person Andras Vass; 29.06.2010
comment
Точно така, много ви благодаря. Трябва да дадете отговор на code4life, той първо отговори с добрия отговор. - person esylvestre; 29.06.2010
comment
Без притеснения – радвам се, че всичко е готово! - person Robert Seder; 29.06.2010