C# 重命名.Net程序集

C# 重命名.Net程序集,c#,.net,.net-assembly,C#,.net,.net Assembly,我们从第三方获得程序集,例如Example.dll。最近,供应商引入了一些突破性的更改,但没有更改组件的名称。我可以将新程序集重命名为例如Example2.dll并使用反射动态加载它吗?它的名称不太明确 是,您可以通过调用assembly.LoadFile或assembly.LoadFrom或类似方法按名称加载任何程序集。推荐的方法是LoadFrom,因为它将程序集加载到默认加载上下文中,并加载从属程序集。但请记住,实际的AssemblyName不会因文件重命名而更改。不过,也有一些工具可以为您

我们从第三方获得程序集,例如
Example.dll
。最近,供应商引入了一些突破性的更改,但没有更改组件的名称。我可以将新程序集重命名为例如
Example2.dll
并使用反射动态加载它吗?它的名称不太明确

是,您可以通过调用
assembly.LoadFile
assembly.LoadFrom
或类似方法按名称加载任何程序集。推荐的方法是
LoadFrom
,因为它将程序集加载到默认加载上下文中,并加载从属程序集。但请记住,实际的AssemblyName不会因文件重命名而更改。不过,也有一些工具可以为您更改程序集名称。

是的,您可以重命名它,因为它不是强名称,但是,这不会更改程序集使用的名称空间,并且如果加载到同一AppDomain中,它将与其他程序集冲突

假设您希望同时使用这两个版本,我能想到的唯一解决方案是将其加载到单独的AppDomain中,并使用代理进行调用。不过,我不会详细介绍如何做到这一点,因为它可能会变得非常复杂。我的建议是,退回给供应商,以纠正出现问题的代码,或者给您一个重命名的程序集


这里有一个让您开始学习的参考资料:

我就是用AutoMapper dll做的。我的解决方案中需要这两个版本,但只是在我的应用程序项目中包含了非标准版本(在dll文件夹中),并将此部分添加到配置文件的运行时部分

  <dependentAssembly>
    <assemblyIdentity name="AutoMapper" publicKeyToken="be96cd2c38ef1005" culture="neutral" />
    <codeBase version="6.1.1.0" href="dlls\AutoMapper.dll" />
  </dependentAssembly>


如果第三方dll发生更改,我只需要记住手动更新dll文件夹(我们从Nuget获得)。

当然,您可以重命名它,因为它不是强名称,但这不会更改所使用的名称空间,如果另一个程序集加载在同一AppDomain中,它将与另一个程序集冲突。@NathanA我相信,如果他使用反射,他实际上仍然可以从
程序集
对象正确解析这些类型。这方面的代码很快就会变得非常笨拙,though@Habib,我想这就是我所经历的。你知道如何在不重新编译dll的情况下绕过它吗?@Grzenio,我认为不重新编译dll是不可能做到的。你能详细说明我可以使用哪些工具吗?我先从ILMerge开始。该程序合并.net程序集。我很确定它应该可以重新命名。我会做一些研究…我很确定IL merge不会有帮助。您可能会发现
Ildasm
Ilasm
很有帮助。您可以重命名程序集并生成新的程序集,但一定要检查您是否违反了任何许可证。@SriramSakthivel:事实上,我认为它应该可以正常工作。选择原始dll作为输入程序集,并指定新名称作为输出程序集。它只有一个文件要合并,所以可能只需要更改名称。合并有什么好处?你会得到一个类型名称冲突,不是吗?