【问题标题】:Dynamic load a .NET assembly with some other dll dependency动态加载具有其他一些 dll 依赖项的 .NET 程序集
【发布时间】:2014-09-30 11:35:51
【问题描述】:

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

比如我要加载A.DLLA.DLL需要B.dll或者C.dll等才能运行。 A.dllA()B() 两种方法。而A()B() 使用B.dllC.dll 的某种方法。

如何动态加载A.DLL并调用A()B()

【问题讨论】:

  • 如果所有依赖程序集都存在,Assembly.Load 应该这样做。您面临什么问题?
  • @Krumia 是对的,您正在寻找的东西已经在 .NET 中并且被称为“MEF”。试试看,很棒!

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


【解决方案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}");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    相关资源
    最近更新 更多