2015-05-24 6 views
0

У меня есть ситуация, когда у меня есть несколько DLL-файлов в разных папках с одинаковым именем, которое содержит те же функции (с одинаковыми именами), но внутри кода с тем же именем отличается.Динамическое изменение ссылки на dll во время выполнения

Я создал свое приложение в дизайне, ссылаясь на один из этих DLL-файлов. Но я хочу это, когда мое приложение запустится, используя случай выбора, чтобы иметь возможность изменить ссылку на одну из этих dll.

Возможно ли это?

Спасибо!

+0

По этому описанию это похоже на архитектуру с подключаемым модулем, вы смотрите на что-то как это? – Alejandro

ответ

2

Вы не можете этого сделать, если вы хотите использовать DLL, выбранную во время выполнения, вам нужно начать с НЕ ссылки на него непосредственно в вашем проекте (который не может быть изменен во время выполнения), а затем вручную загрузить его в вашем приложении, используя Assembly.Load, и подумайте над ним, чтобы использовать его типы (поскольку вы не знаете типы во время компиляции, поскольку на них не ссылаются, поэтому вам нужно запрограммировать его на типы, которые вы запрашиваете).

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

Например, если у вас есть типа «MyType» с методом «MyMethod» в DLL с именем «MyDLL.dll», если вы ссылаетесь его, используя это так же просто, как делать

new mytype().mymethod(); 

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

var asm = Assembly.Load("mydll.dll"); 
var type = asm.DefinedTypes.Single(t=>t.Name == "mytype"); 
var instance = Activator.CreateInstance(type); 
var methodinfo = type.GetMethod("mymethod"); 
methodinfo.Invoke(instance); 

Кроме того, мы должны знать, что вы пытаетесь достичь, есть способы, чтобы сделать это немного проще, но это зависит от случая использования (в плагиновой системе, например, вы объявите интерфейс для плагина и поделитесь этой DLL и ссылайтесь на него напрямую, только динамически загружайте плагины, чтобы вы могли напрямую приводить экземпляр к этому интерфейсу и не требовать динамического вызова методов)

+0

Я пытаюсь решить один из моих других вопросов, сделанных здесь: http://stackoverflow.com/questions/30405626/. Но поскольку у меня нет ответа на этот вопрос, я подумал, что смогу решить этот вопрос, если я получу решение по этому вопросу. – alex

+0

Если smo libs не совместимы ни с обратным, ни с восходящим потоком, вам нужно будет сделать то, что я положил в свой ответ, да. Вы уверены, что это не так? (Не можете просто использовать более старый для более новых версий?) –

+0

нет, это не так. Но использование вашей идеи кажется не очень подходящим для использования. , потому что я точно знаю типы, имя функций и все одинаковые в каждом файле dll. Фактически я нашел эту ссылку, но не знаю, как я могу использовать в своем случае: http://blog.slaks.net/2013-12-25/redirecting-assembly-loads-at-runtime/. У вас есть идеи? – alex