使用另外一些dll依赖项动态加载.NET程序集

3
我想为我的应用程序创建一个插件引擎,但是我有一个问题:如何加载一个依赖于其他程序集的.Net程序集(实际上是我的插件)。
例如,我想要加载A.dll,但是A.dll需要B.dllC.dll等其他程序集才能运行。 A.dll有两个方法,分别是A()B(),而A()B()使用了B.dllC.dll的一些方法。
要动态加载A.dll并调用A()B(),您应该怎么做?

1
如果所有相关的程序集都存在,Assembly.Load 应该可以做到这一点。您遇到了什么问题? - Sriram Sakthivel
请查看托管可扩展性框架 - sampathsris
@Krumia是正确的,你要找的已经在.NET中了,它被称为'MEF'。试试吧,它很棒! - Steffen Winkler
1个回答

2
使用当前 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}");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接