重命名 .Net 组件

6
我们从第三方获取了一个程序集,例如 Example.dll。最近这个供应商引入了一些破坏性的更改,但没有改变程序集的名称。我能否将新的程序集重命名为例如 Example2.dll 并使用反射动态加载它?它没有强名称。

1
https://dev59.com/rm035IYBdhLWcg3wE7xr - Habib
2
当然可以重命名它,因为它没有强名称,但这不会改变所使用的命名空间,并且如果它们在同一个AppDomain中加载,它将与其他程序集发生冲突。 - Nathan A
@NathanA 我相信如果他使用反射,他仍然可以从 Assembly 对象正确解析这些类型。不过,这段代码很快就会变得非常笨重。 - drew_w
@Habib,我想这就是我正在经历的问题。有没有办法在不重新编译dll的情况下解决它呢? - Grzenio
@Grzenio,我认为这只能通过重新编译dll来完成。 - Habib
显示剩余2条评论
3个回答

3
是的,您可以重命名它,因为它没有强名称。但是,这不会改变程序集使用的命名空间,并且如果它们在同一个AppDomain中加载,它将与其他程序集冲突。
我能想到的唯一解决方案是,在单独的AppDomain中加载它,并使用代理进行调用。然而,我不会详细介绍如何做到这一点,因为它可能非常复杂。我的建议是,向供应商反馈以纠正破坏性代码或提供重新命名的程序集。
以下是一个参考文献,可帮助您开始:http://msdn.microsoft.com/en-us/library/yk22e11a(v=vs.110).aspx

0
我使用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获取它)。


0

是的,你可以通过调用Assembly.LoadFileAssembly.LoadFrom或类似的方法来按名称加载任何程序集。 推荐使用LoadFrom方法,因为它将程序集加载到默认加载上下文中,并且还会加载依赖的程序集。但请记住,实际的 AssemblyName 并不会因为文件重命名而改变。尽管有一些工具可以替你更改程序集名称。


1
你能详细说明一下我可以使用哪些工具吗? - Grzenio
我会从ILMerge开始。这个程序可以合并 .net 程序集。我相信它应该能够重命名它。我会做一些研究... - Farhad Alizadeh Noori
我非常确定 IL 合并不会有所帮助。你可能会发现 IldasmIlasm 有用。你可以重命名程序集并构建新的,但请检查是否违反了任何许可证。 - Sriram Sakthivel
@SriramSakthivel:实际上我认为它应该可以正常工作。选择原始dll作为输入程序集,并将新名称指定为输出程序集。它只有一个文件需要合并,所以可能只会更改名称。 - Farhad Alizadeh Noori
合并的好处是什么?你不会得到类型名称冲突吗? - Sriram Sakthivel
不,我猜ILMerge只会在只有一个输入程序集时更改程序集名称。它不会尝试将程序集与自身合并,因此没有冲突。 - Farhad Alizadeh Noori

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接