尽管我有一个特定的案例,但是我想知道总体情况。
当作为对Visual C#项目的引用添加时,两个DLL是否可以相互冲突以防止构建解决方案?如果是这样,有什么可能的方法来减轻这种情况。
尽管我有一个特定的案例,但是我想知道总体情况。
当作为对Visual C#项目的引用添加时,两个DLL是否可以相互冲突以防止构建解决方案?如果是这样,有什么可能的方法来减轻这种情况。
Answers:
这是很有可能的。
如果在不同的程序集(或在您的项目和添加的程序集)中定义了相同的名称空间和类型名称,则将与尝试使用其中一种或另一种类型的代码冲突。
如果确保您具有唯一的名称空间,那么您的引用也不会出现此问题。
另一种可能性与依赖关系的不同版本有关—如果您的项目使用(例如)版本为1.2的日志记录库,但是添加的程序集对同一程序集却具有不同的版本(例如1.3)以及您的项目依赖或添加的程序集已配置/构建为使用特定版本,则将发生冲突,并且构建将失败。
这两个问题都可以用汇编别名所描述的解决,在这里。
看到没有其他人提到此,您问:
有什么可能的方法来减轻这种情况
有一个针对这种情况的干净解决方案,没有任何限制,也没有令人讨厌的解决方法。您可以定义程序集别名,以便编译器知道在正确的位置要引用哪些。
看看http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx
是的,这很有可能。
假设您添加了对某些使用旧版Lucene.Net的DLL的引用,并且希望包含最新版本。
您可以使用外部别名来解决该问题:http : //msdn.microsoft.com/zh-cn/library/ms173212.aspx
您可以在全局程序集缓存中放置任意数量的不同版本的程序集,只要它们是强名称即可。如果您希望不同的应用程序以机器方式使用程序集的不同版本,这可能会对您有所帮助。但是,在ONE应用程序中使用不同版本的程序集仍然会给您带来麻烦。
您同时需要两个版本的原因是什么?
当然。当无法区分两个对象时,会出现“歧义引用”编译器错误。通常,您可以在代码中指定完整路径,不会引起问题,但是如果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框架的实际开发人员除外)。