1

我通过将特定 DLL 的“复制本地”设置为 false 来触发 AssemblyResolve。我的 AssemblyResolve 被触发,我可以选择我的 DLL 的位置。

稍后在代码中,我希望 AssemblyResolve 重新触发,以便我可以指定一个新的 DLL 位置,但由于第一个 AssemblyResolve 的 DLL 已成功加载,我无法重新加载新的 DLL。

有没有办法可以清除当前的 DLL 并重新加载它?或类似的东西???

谢谢!

4

3 回答 3

4

您必须使用 Assembly.LoadFile() 来完成此操作。您不能使用 AssemblyResolve 来做到这一点,CLR 会非常小心地避免重新加载程序集,因为这会为混合同一类的不同版本打开大门。一些方法针对一个版本,一些针对另一个版本。没有任何方法可以保证,随之而来的是欢闹。

然而,LoadFile() 是一把枪,它以非常有创意且难以诊断的方式射击你的脚并在你的脸上炸毁。令人高兴的是,完全相同的类型在加载两次时是不兼容的。你最好重新考虑一下。

于 2011-03-14T21:06:21.507 回答
0

你怎么可能想象在一个正在运行的程序中做到这一点?更重要的是为什么?程序集代表一些可执行代码的工作版本。为什么要在同一运行时拥有替代现实。我看不到目的,这可能表明存在一些设计缺陷?您可以在代码中创建一个单独的 ApplicationDomain 并使用您想要的任何程序集再次加载您的应用程序。但为什么呢?

卢克

于 2011-03-14T20:45:37.183 回答
0

试试这样:

string dllFile = "C:\\sample.dll";
Assembly asmLoader = Assembly.LoadFile(dllFile);
Type[] types = asmLoader.GetTypes();

由于在应用程序仍处于@runtime 状态时无法重新加载/替换程序集中的所有资源,因此请使用 LoadFile()。

于 2014-05-13T05:14:26.723 回答