【问题标题】:Load multiple assemblies加载多个程序集
【发布时间】:2016-01-31 01:12:16
【问题描述】:

如何从应用程序的 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 并且两者都有一个强名称。

如何在运行时加载它们?

【问题讨论】:

标签: c# .net assemblies strongname


【解决方案1】:

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

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

【讨论】:

  • 它不工作。我添加了AppedPrivatePath 调用以指向我的目录,但我对Assembly.Load(...) 的调用仍然找不到任何东西并给我一个FileNotFoundException!
  • 你是如何指定路径的?不要使用完整路径,而是相对于您的应用程序目录(*.exe 所在的位置)的路径
  • 我终于找到了问题:如果您多次调用AppendPrivatePath,例如在例如AppendPrivatePath(dir1); AppendPrivatePath(dir2); AppendPrivatePath(dir3); 它还将按此确切顺序查找程序集。这意味着如果您有两个具有相同名称和不同标识(例如不同版本)的程序集,它将通过查看目录dir1,然后是dir2,然后是@,来获取与程序集名称匹配的第一个程序集987654331@。 ...
  • ... 如果要加载包含在dir2 中的程序集,并且在dir1 中有同名程序集,则计划将不会成功。解决方案是按照您的建议使用AppendPrivatePath,并在它之前调用ClearPrivatePath,这样您始终只有一个路径集。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2021-05-09
    • 2012-10-15
    相关资源
    最近更新 更多