C# 重新触发程序集解析?

C# 重新触发程序集解析?,c#,assemblyresolve,C#,Assemblyresolve,我通过将特定DLL的“复制本地”设置为false来触发AssemblyResolve。 我的AssemblyResolve被触发,我可以选择DLL的位置 在代码的后面部分,我希望AssemblyResolve重新触发,以便指定新的DLL位置,但是由于第一个AssemblyResolve中的DLL已成功加载,因此无法重新加载新的DLL 有没有办法清除当前DLL并重新加载它?或者类似的东西 谢谢 你怎么能想象在运行的程序中这样做呢?更重要的是为什么?程序集表示某些可执行代码的工作版本。为什么您希望在

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

在代码的后面部分,我希望AssemblyResolve重新触发,以便指定新的DLL位置,但是由于第一个AssemblyResolve中的DLL已成功加载,因此无法重新加载新的DLL

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


谢谢

你怎么能想象在运行的程序中这样做呢?更重要的是为什么?程序集表示某些可执行代码的工作版本。为什么您希望在同一运行时具有备用现实。我看不出它的用途,这可能表明了一些设计缺陷?你可以在代码中创建一个单独的应用程序域,然后用你想要的任何程序集再次加载你的应用程序。。但是为什么呢


luke

你怎么能想象在运行的程序中这样做呢?更重要的是为什么?程序集表示某些可执行代码的工作版本。为什么您希望在同一运行时具有备用现实。我看不出它的用途,这可能表明了一些设计缺陷?你可以在代码中创建一个单独的应用程序域,然后用你想要的任何程序集再次加载你的应用程序。。但是为什么呢


luke

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


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

您必须使用Assembly.LoadFile()来实现这一点。使用AssemblyResolve无法做到这一点,CLR会非常小心地避免重新加载程序集,因为这将打开混合同一类的不同版本的大门。有些方法针对一个版本进行JIT,有些则针对另一个版本。没有任何办法保证这一点,欢闹随之而来

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

试着这样做:

string dllFile = "C:\\sample.dll";
Assembly asmLoader = Assembly.LoadFile(dllFile);
Type[] types = asmLoader.GetTypes();
因为当应用程序仍处于@runtime时,程序集中的所有资源都不能重新加载/替换 使用LoadFile()。

尝试如下操作:

string dllFile = "C:\\sample.dll";
Assembly asmLoader = Assembly.LoadFile(dllFile);
Type[] types = asmLoader.GetTypes();
因为当应用程序仍处于@runtime时,程序集中的所有资源都不能重新加载/替换

使用LoadFile()。

为什么要这样做?我试图通过加载每个dll并从每个dll获得一些结果来比较一些开发和生产代码的结果。如果有更好的方法,我非常愿意:)为什么不在一个新的应用程序域中加载程序集,处理结果,比较它们,然后完成工作?decyclone,你能给我介绍一些如何在一个新的应用程序域中加载程序集的示例代码吗?您描述的解决方案似乎比我现在所做的要优雅得多。谢谢你为什么要这样做?我试图通过加载每个dll并从每个dll获得一些结果来比较一些开发代码和生产代码的结果。如果有更好的方法,我非常愿意:)为什么不在一个新的应用程序域中加载程序集,处理结果,比较它们,然后完成工作?decyclone,你能给我介绍一些如何在一个新的应用程序域中加载程序集的示例代码吗?您描述的解决方案似乎比我现在所做的要优雅得多。谢谢,这里有一点背景:我试图通过加载每个dll并从每个dll获得一些结果来比较一些开发代码和生产代码的结果。如果有更好的方法,我很乐意:)为什么你的答案看起来像一张赎金券?您是否从杂志中剪下了每个字母?使用后期绑定(Assembly.Load)并指定不同的版本(即完整的程序集名称)。然后处置程序集并加载另一个。使用反射实例化对象。但更好的方法实际上是通过编写测试(单元或集成)来分离测试并比较结果并在不同的运行中运行。实际上,您可以在app.config中指定要加载的ddl。是否需要在同一个运行时中加载?luckyluke,我要求在单个运行时运行所有这些。您必须生成具有每个进程加载的不同程序集版本的进程或AppDomain。CLR不支持加载same汇编两次。据我所知,您无法卸载assemblySure,这里有一个小背景:我试图通过加载每个dll并从每个dll获得一些结果来比较一些开发代码和生产代码的结果。如果有更好的方法,我非常愿意:)为什么您的答案看起来像一张赎金便条?您是否从杂志中剪下了每个字母?使用后期绑定(Assembly.Load)并指定不同的版本(即完整的程序集名称)。然后处置程序集并加载另一个。使用反射实例化对象。但更好的方法实际上是通过编写测试(单元或集成)来分离测试并比较结果并在不同的运行中运行。实际上,您可以在app.config中指定要加载的ddl。是否需要在同一个运行时中加载?luckyluke,我要求在单个运行时运行所有这些。您必须生成具有每个进程加载的不同程序集版本的进程或AppDomain。CLR不支持加载sam两次组装。据我所知,你不能卸载组装。是的,你必须强调这显然是一个错误的情况…创建一个对象纯粹是一种乐趣…但是,在