2011-03-14 47 views
0

我通过将特定DLL的“Copy Local”设置为false来触发AssemblyResolve。 我的AssemblyResolve被触发,我可以选择我的DLL的位置。重新触发程序集解决?

在后面的代码中,我想AssemblyResolve重新触发,所以我可以指定一个新的DLL位置,但由于从第一个AssemblyResolve DLL成功加载,我不能重新加载一个新的DLL。

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

谢谢!

+0

你为什么要这么做? – decyclone 2011-03-14 20:43:14

+0

我想通过加载每个DLL并从每个DLL获取一些结果来比较某些开发和生产代码的结果。如果有更好的方法来做到这一点,我对它很开放:) – sooprise 2011-03-14 20:44:35

+0

为什么不在一个新的AppDomain中加载程序集,处理结果,比较它们,并完成工作? – decyclone 2011-03-14 20:47:05

回答

3

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

然而,LoadFile()却是一种能够以非常有创意和难以诊断的方式拍摄你的脚并在你的脸上冒出来的枪。一种喜悦是,当两次加载时,完全相同的类型是不兼容的。你最好重新考虑一下。

+0

是的,你必须强调,这显然是一个错误的情况......创建一个对象是纯粹的快乐......但是,毕竟,我们已经做了一些非常糟糕的事情来测试系统吗? – luckyluke 2011-03-14 21:23:05

0

你有可能想象在一个正在运行的程序中这么做吗?更重要的是为什么?程序集表示一些可执行代码的工作版本。为什么你希望在相同的运行时间有替代的现实。我看不到目的,这可能表明一些设计缺陷?你可以在代码中创建一个单独的ApplicationDomain,然后用你想要的任何程序集重新加载你的应用程序。但为什么?

luke

+0

当然,这里有一点背景:我试图通过加载每个DLL并从每个DLL获取一些结果来比较某些开发和生产代码的结果。如果有更好的方法来做到这一点,我对它很开放:) – sooprise 2011-03-14 20:46:19

+1

为什么你的答案看起来像赎金?你想把电子开关切断吗? – jonathanpeppers 2011-03-14 20:47:14

+0

使用后期绑定(Assembly.Load)并指定不同的版本(即FULL的程序集名称),然后处理程序集并加载另一个程序集,使用反射来实例化对象,但更好的方法是实际分离测试并通过比较结果编写测试(单元或集成),并在不同的运行中运行.YOu实际上可以指定在app.config中加载哪个ddl。是否需要在同一运行时间内执行该操作? – luckyluke 2011-03-14 20:50:54

0

尝试这样的:

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

由于从组件的所有资源不能被重新加载/更换而应用程序仍然是@运行 使用的LoadFile()。