动态加载具有其他dll依赖关系的.NET程序集

时间:2014-09-30 11:35:52

标签: c# plugins dll .net-assembly dynamic-loading

我想为我的应用程序创建一个插件引擎,但我有一个问题:如何加载.Net程序集(实际上是我的插件),它与其他程序集有一些依赖关系。

例如,我想加载A.DLLA.DLL需要B.dllC.dll等等来运行。 A.dll有两种方法,例如A()B()A()B()使用B.dllC.dll的某种方法。

我应该如何动态加载A.DLL并致电A()B()

1 个答案:

答案 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}");
}