【问题标题】:Assembly names conflict on external dependencies程序集名称与外部依赖项冲突
【发布时间】:2015-09-22 17:43:03
【问题描述】:

如果我有一个应用程序(App)引用了一个库(Lib1),而该库本身又引用了另一个库(Lib2),那么当应用程序引用 Lib1 时,它也会复制 Lib2 dll 并正常工作。

如果我还将对 App 的另一个引用添加到另一个不同的库,但名称与 Lib2 (Lib2bis) 相同,则 Lib1 将尝试使用 Lib2bis 中的类型而不是 Lib2(因为我相信 Lib2 文件会被覆盖由 Lib2bis 文件(命名相同)。

由于 App 对 Lib2 的引用是间接的,所以在执行之前我不会知道 Lib2bis 与 Lib2 冲突,这会导致运行时错误。

有什么方法可以防止/解决这个问题(除了重命名库...)(理想情况下,不使用别名,但如果有的话,我也有兴趣知道别名解决方案)。

【问题讨论】:

  • 您必须重命名库 DLL。但是如果两个程序集使用相同的命名空间和类名,但代表不同的类,它根本就行不通。
  • @MatthewWatson - 两个独立的程序集可以声明具有相同完全限定名称的类型(对于某些“fine”值)。这就是 extern alias 旨在帮助解决的问题。
  • @Damien_The_Unbeliever 是的,但如果程序集具有相同的 DLL 名称,则不是?所以他必须重命名它并使用extern alias
  • 给你的 dll 起一个更好的名字来避免这种情况。
  • 您并不总是可以选择;您可能正在为其中一个程序集使用名称,并且引用可能是来自外部公司的程序集,或者您可能有同一程序集的两个版本,因此重命名并不总是解决方案。

标签: c# .net msbuild


【解决方案1】:

你需要assembly alias

为您的程序集设置别名(在我的示例中为 sanford):

在代码中:

extern alias sanford;
using System;
...

event EventHandler<sanford::Sanford.StateMachineToolkit.Data> TransitionCompleted;

另外,您需要重命名一个 dll 文件。

【讨论】:

  • 别名解决了编译问题,但不能解决bin目录只能包含一个Lib2.dll文件的事实,我认为这是OP试图解决的问题。跨度>
  • @Damien_The_Unbeliever 如果我没记错的话,重命名应该会有所帮助
  • @Damien_The_Unbeliever 你是对的,它不能解决重命名问题;一旦我构建/添加引用,一个就会覆盖另一个。如果有办法告诉放置后缀而不是覆盖,那就太好了。
猜你喜欢
  • 2016-11-05
  • 2019-08-08
  • 2021-11-05
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 2016-09-17
相关资源
最近更新 更多