加载多个程序集

Load multiple assemblies

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

通常可以使用

从自定义位置加载程序集
Assembly.LoadFrom(path);

这行得通,但似乎要加载强名称程序集,我需要指定其完整显示名称,例如 in

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

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

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

如何在运行时加载它们?

您可以通过加载文件从其位置加载任何程序集 (example here)

如果您想使用一个程序集的多个版本,请考虑处理 AppDomain.CurrentDomain.AssemblyResolve (example here)

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

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

    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" 的文件。