两个DLL是否可能发生冲突,从而导致解决方案无法构建


Answers:


13

这是很有可能的。

如果在不同的程序集(或在您的项目和添加的程序集)中定义了相同的名称空间和类型名称,则将与尝试使用其中一种或另一种类型的代码冲突。

如果确保您具有唯一的名称空间,那么您的引用也不会出现此问题。

另一种可能性与依赖关系的不同版本有关—如果您的项目使用(例如)版本为1.2的日志记录库,但是添加的程序集对同一程序集却具有不同的版本(例如1.3)以及您的项目依赖或添加的程序集已配置/构建为使用特定版本,则将发生冲突,并且构建将失败。

这两个问题都可以用汇编别名所描述的解决,在这里


我不确定这是真的。如果查看CIL,CLR会在某些程序集中显式引用符号,并在每个符号之前使用[assembly]标记。C#编译器可能会强制执行此问题,但我认为这不是平台约束。
Yam Marcovic

@Yam Marcovic如何将编译器找出您要在特定类中使用的命名空间?完全合格的类名称冲突肯定会阻止构建。
杰里米(Jeremy)

当处理相同名称(可能定义了相同符号)的程序集时,C#编译器为您提供了程序集别名的选项。见stackoverflow.com/questions/517058/...
山药Marcovic

@Yam-是的,但是,您需要了解此标志并使用它。简单地添加程序集会破坏构建。
奥德

1
明显。那就是为什么他来这里寻求帮助,对吧?他想知道并使用此标志,因为它将为他提供更清洁的解决方案,而不会影响他的项目或第三者公用事业。
Yam Marcovic



1

您可以在全局程序集缓存中放置任意数量的不同版本的程序集,只要它们是强名称即可。如果您希望不同的应用程序以机器方式使用程序集的不同版本,这可能会对您有所帮助。但是,在ONE应用程序中使用不同版本的程序集仍然会给您带来麻烦。

您同时需要两个版本的原因是什么?


1
好吧,我没有明确添加其他版本。基本上我有一个WPF应用程序。现在,为了添加第三方功能,我添加了一些DLL,而这些DLL可能存在冲突。
Shamim Hafiz

1
好的,那么您也许可以将这些第三方相关的DLL添加到GAC中?自从我读到这些东西已经很长时间了,但是我怀疑这可以解决您的问题。
2011年

GAC在这里是什么意思?
Shamim Hafiz


0

当然。当无法区分两个对象时,会出现“歧义引用”编译器错误。通常,您可以在代码中指定完整路径,不会引起问题,但是如果dll完全相同,则您将无法以任何方式区分两个对象。Sya我们有两个dll:

包含File类的System.IO

MyProject.IO包含一个File类

如果你有这样的事情...

using System.IO;
using MyProject.IO;

...
private void foo()
{
    File f = new File();
}

...您将有一个不明确的参考,因为无法分辨您正在谈论哪个文件。这将解决它:

using System.IO;
using MyProject.IO;

...
private void foo()
{
    MyProject.IO.File f = new MyProject.IO.File();
}

很难修复的唯一方法是两个组件中“文件”的路径相同,但这将需要一种不太可能的情况,即两个DLL具有相同的命名空间结构。例如,我的上述情况将永远不会发生,因为没有人将项目命名为“系统”(.Net框架的实际开发人员除外)。


实际上,如果您基于流行的第三方库构建解决方案,则会发生很多事情。例如,Twitter可能库依赖于旧版本的JSON LIB的
晃龙
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.