【问题标题】:Load same dll multiple times多次加载相同的dll
【发布时间】:2015-05-07 23:49:20
【问题描述】:

我正在尝试在我的主机程序运行时加载不同版本的 dll。我不能使用不同的 AppDomain 并卸载它们,原因是我的主机程序只是一个测试设置,而真正的应用程序 (Autodesk 3ds Max) 不支持它,我无法对此进行任何更改。这就是我在测试程序中加载 dll 的方式:

var testAssembly = Assembly.LoadFrom(textBox1.Text);
var formObject = testAssembly.CreateInstance("Dll_Test.Form1");
(formObject as Form).Show();

我在这里读到:https://msdn.microsoft.com/en-us/library/dd153782.aspx#load_contexts“如果已经加载了具有相同标识的程序集,即使指定了不同的路径,LoadFrom 也会返回加载的程序集。”

所以这正是我的问题,起初我只是尝试重命名我的 dll,用一些更改编译我的新的,然后再次调用 LoadFrom。但是,这并没有显示我的更改,我认为这是因为该程序集仍然具有与前一个相同的标识。我想我可以通过签署程序集 (https://msdn.microsoft.com/en-us/library/wd40t7ad.aspx) 来更改身份。不幸的是,我必须使用的第三方 dll 没有签名。

有没有办法在每次编译时更改我的 dll 的身份而不更改程序集名称?这样我就可以在 Assembly.LoadFrom(path) 中继续使用相同的路径字符串。如果不是,我可以解决程序集名称更改问题,但有些人对每次构建时更改程序集名称有疑问 (Unique Assembly name every build)

【问题讨论】:

  • DLL Hell 引入签名是有原因的。

标签: c# .net dll


【解决方案1】:

不,非强签名程序集的标识仅是其名称,因此您必须更改名称。

请注意,您可以使用其他“加载”方法,甚至从字节数组加载,但通常它会给您带来更多的痛苦而不是价值。当您处理程序集身份、LoadFrom 和相关主题时,几乎需要阅读 Suzanne Cook 的博客文章。

如果需要重新加载程序集,一种解决方案是构建代理,它将调用转发到其他 AppDomain 并将不断变化的程序集加载到新的 AppDomain 中(假设您可以将完全受信任的代码加载到 Autodesk 3ds Max 中,以便您自己管理 AppDomain )。

【讨论】:

  • 我肯定会尝试 Alexei 的想法,即创建一个本身就是 AppDomains 代理的 DLL。
猜你喜欢
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多