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

простой вопрос, вероятно, легко для вас ответить.

У меня есть 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);

Каждый раз, когда линия, указанная как неработающая, выдает

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
Просто хочу отметить, что этот код будет загружаться в основной домен приложения и блокировать целевую сборку на время жизни приложения. Чтобы предотвратить это (и фактически выгрузить цель), вам нужно создать прокси-объект, который загружается динамически, загружает цель динамически (этот код) и, наконец, затем перемешивает сериализуемые данные (при необходимости) обратно в вызывающее приложение.   -  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