【问题标题】:How to reference different assemblies with the same name?如何引用具有相同名称的不同程序集?
【发布时间】:2010-08-16 09:34:12
【问题描述】:

我需要将 2 个同名的不同程序集添加到我的项目中。

当我尝试将两个引用都添加到项目中时,Visual Studio 告诉我程序集已被引用(因为已经存在同名的程序集)。

我尝试重命名其中一个文件。我可以添加这两个引用,但是,当从重命名的程序集访问方法时,解决它失败(因为 .net 尝试使用原始名称加载程序集)。

注意:这些程序集不是我的,因此我不能更改它们的内容。

【问题讨论】:

  • 顺便说一句,如果出现名称冲突,这意味着您从中获取程序集的人可能没有遵循命名约定。而且,如果他们懒得去得到这样微不足道的东西,那这对他们生成的实际代码有什么影响?

标签: .net visual-studio-2008


【解决方案1】:

如果它们是强签名的并且有不同的公钥,也许你可以试试这个:

有一个单独的库项目来包装两个程序集之一。这样,您可以为其中一个选择不同的名称和命名空间,然后直接引用两个程序集之一,间接引用另一个。

挑战在于,如果两个程序集具有相同的文件名,则在运行时不能将它们放在同一个文件夹中。由于它们是强签名的,您可以将它们都放入全局程序集缓存 (GAC) 中,或者您可以在运行时将两者之一放入子文件夹中,然后将该子文件夹添加到探测路径中。

祝你好运!

【讨论】:

  • 创建一个包装项目似乎是最好的选择,但是在不必为所有类、方法和属性编写存根的情况下公开内部程序集的最佳方法是什么?
  • 在那种情况下,我会去包装我需要更少的类、方法和属性的那个。
【解决方案2】:

另一种选择是使用 ildasm 反汇编其中一个程序集,然后使用 ilasm 以不同的名称将其组装回来。

例如,要添加 2 个对同一程序集的引用,在我的系统上,我执行以下操作(Windows 7、64 位,因此相应地调整路径)

d:\Sandbox>"c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\ildasm.exe" /all /out=SandboxLib2.il SandboxLib.dll

紧随其后

d:\Sandbox>"c:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm.exe" /dll SandboxLib2.il

在此之后,我有另一个名为 SandboxLib2.dll 的程序集。即使它与第一个程序集相同,我也可以在我的项目中添加对这两个 .dll 的引用。

【讨论】:

  • 除非我做错了什么,否则不会这样做。该程序集仍将具有原始名称,这意味着实际上我似乎只有文件名,但没有实际的程序集名称。
  • 在重新编译之前尝试更新 IL。在 nodepad 中打开它,并用 SandboxLib2 对 SandboxLib 的所有实例进行文本替换。在组装部分,你将不得不做一些十六进制编码。
猜你喜欢
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
相关资源
最近更新 更多