加载多个程序集

本文关键字:程序集 加载 | 更新日期: 2023-09-27 18:32:39

如何使用程序集的完整显示名称从应用程序 bin 路径之外的位置加载程序集?

通常可以从自定义位置加载程序集

Assembly.LoadFrom(path);

这有效,但似乎要加载强名称的程序集,我需要指定其完整的显示名称,例如

Assembly myDll =
Assembly.Load("myDll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=9b35aa32c18d4fb1");

但这里的问题是,这仅引用我的应用程序的探测路径中的程序集。

那么,如果我有一个程序集dir1/asm.dll和一个程序集dir2/asm.dll并且两者都有一个强名称怎么办?

如何在运行时加载它们?

加载多个程序集

在运行时,可以通过以下方法指定加载程序集时要探测的其他目录:

    AppDomain.CurrentDomain.ClearPrivatePath();
    AppDomain.CurrentDomain.AppendPrivatePath();

如果在安装过程中已知子目录名称,则还可以在 app.config 文件的 <probing> 元素的 privatePath 属性中指定这些附加目录。

还要确保文件名正确。当你有

AppDomain.CurrentDomain.AppendPrivatePath("Subdir");
Assembly myDll = Assembly.Load("myDll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=9b35aa32c18d4fb1");

然后.net将在可执行文件目录下的目录"Subdir"中查找名为"mydll.dll"的文件。

您可以通过 loadfile 从其位置加载任何程序集(此处的示例)

如果要采用程序集的多个版本,请考虑处理 AppDomain.CurrentDomain.AssemblySolve(此处的示例)

这些示例来自一个小型开源项目,该项目将从单独的"包"文件夹加载 DLL(允许包使用隔离加载程序拥有自己的依赖项副本)