我想为我的应用程序创建一个插件引擎,但我有一个问题:如何加载.Net程序集(实际上是我的插件),它与其他程序集有一些依赖关系。
例如,我想加载A.DLL
和A.DLL
需要B.dll
或C.dll
等等来运行。 A.dll
有两种方法,例如A()
和B()
。 A()
或B()
使用B.dll
或C.dll
的某种方法。
我应该如何动态加载A.DLL
并致电A()
或B()
?
答案 0 :(得分:1)
在当前AppDomain中使用AssemblyResolve事件:
加载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}");
}