2014-09-30 2 views
2

Я хочу создать плагин для моего приложения, но у меня есть проблема: как я могу загрузить сборку .Net (на самом деле мой плагин), которая имеет некоторую зависимость от других сборка.Динамическая загрузка сборки .NET с некоторой другой зависимостью dll

Например, я хочу, чтобы загрузить A.DLL и A.DLL нужно B.dll или C.dll и так далее, чтобы бежать. A.dll имеет два метода, таких как A() и B(). И A() или B() использовать какой-либо метод B.dll или C.dll.

Что нужно сделать для динамической загрузки A.DLL и позвоните по номеру A() или B()?

+1

' Assembly.Load' должен делать это, если существуют все зависимые сборки. С какими проблемами вы сталкиваетесь? –

+0

Взгляните на [Managed Extensibility Framework] (http://msdn.microsoft.com/en-us/library/dd460648 (v = vs.110) .aspx) – Krumia

+0

@ Krumia прав, что вы ищете уже в .NET и называется «MEF». Попробуй, это здорово! –

ответ

1

Использование AssemblyResolve событий в текущем AppDomain:

Для загрузки библиотеки DLL:

string[] dlls = { @"path1\a.dll", @"path2\b.dll" }; 
foreach (string dll in dlls) 
{ 
    using (FileStream dllFileStream = new FileStream(dll, FileMode.Open, FileAccess.Read)) 
    { 
     BinaryReader asmReader = new BinaryReader(dllFileStream); 
     byte[] asmBytes = asmReader.ReadBytes((int)dllFileStream.Length); 
     AppDomain.CurrentDomain.Load(asmBytes); 
    } 
} 
// attach an event handler to manage the assembly loading 
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 

это событие обработчик проверяет для имени узла и возвращает право один:

private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    AppDomain domain = (AppDomain)sender; 
    foreach (Assembly asm in domain.GetAssemblies()) 
    { 
     if (asm.FullName == args.Name) 
     { 
      return asm; 
     } 
    } 
    throw new ApplicationException($"Can't find assembly {args.Name}"); 
} 
Смежные вопросы