C # Reflection, AppDomain: выполнение одной и той же сборки из разных папок - PullRequest
0 голосов
/ 25 июля 2011

У меня следующая ситуация.Существует n папок, каждая из которых содержит две сборки:

Assembly1.dll и Assembly2.dll

  • Вся сборка1.DLL точно такие же

  • Все файлы Assembly2.dll немного отличаются друг от друга, но имеют одинаковые классы / методы.

  • ВсеСсылка Assembly1.dll на Assembly2.dll

В моей программе я хотел бы создать экземпляр некоторого класса внутри Assembly1 и вызвать метод для этого класса:

for(int i = 0; i < 100; i++)
{ 
    Assembly myAssembly1 = Assembly.LoadFrom("Directory"+ i + "\\Assembly1.dll");
    Type myType = myAssembly1.GetType("MyClass");

    object myObject = Activator.CreateInstance(myType);
    myType.Invoke(myMethodName, BindingFlags.InvokeMethod, null, myObject, null);
}

Этот фрагмент кода выполняется для каждой папки, содержащей файл Assembly1.dll. Проблема в том, что первый файл работает нормально, но после этого файл Assembly2.dll уже был загружен и не будет перезагружен.Однако его необходимо заменить на тот, который находится внутри текущей папки (номер i).Это потому, что это немного отличается.

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

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

Может ли кто-нибудь привести пример кода, как инициализировать новый AppDomain и выполнить вышеупомянутый код в этом новом домене (так чтобы ссылалась Assembly2.DLL будет загружен и выгружен правильно)?

Или у кого-то есть иное представление о том, как решить эту проблему?

С наилучшими пожеланиями, Кристиан

Ответы [ 2 ]

1 голос
/ 25 июля 2011

отметьте это http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx и это http://msdn.microsoft.com/en-us/library/ff527268.aspx out ... вы можете создать AppDomains, загрузить сборку1 и назначить обработчик для AssamblyResolve Event, где вы можете передать его правильной сборке2 .. , см. Можно ли указать каталоги зависимостей при динамической загрузке сборок?

0 голосов
/ 25 июля 2011

Я наконец-то заработал.Для всех вас с такой же проблемой это решение:

AppDomain myDomain = AppDomain.CreateDomain("MyDomain");

string pathToTheDll = "C:\\SomePath\\MyAssembly1.dll";
object obj = myDomain.CreateInstanceFromAndUnwrap(pathToTheDll, "MyAssembly1.TypeName");
Type myType = obj.GetType();

myType.InvokeMember("SomeMethodName", BindingFlags.InvokeMethod, null, obj, null);

AppDomain.Unload(myDomain);

Надеюсь, это кому-нибудь поможет!

...