多次加载相同的dll

时间:2015-05-07 23:49:20

标签: c# .net dll

我正在尝试在我的主机程序运行时加载不同版本的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

1 个答案:

答案 0 :(得分:2)

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

请注意,您可以使用其他"加载"方法,甚至从字节数组加载,但一般来说它会给你带来更多的痛苦。当你处理汇编标识LoadFrom和相关主题时,Suzanne Cook的博客文章几乎是必读的。

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