我想知道在创建要包含在与依赖关系相关的其他项目中的库的版本时是什么启发式,以及我是否应该包含它们.
我的问题如下:
我有一个CommonUtilities库,它提供了一组可以在多个地方使用的实用程序.CommonUtilities的依赖包括log4net.dll(日志框架)和Oracle.DataAccess.dll(数据库驱动程序).
我有另一个名为MyProject的项目,我希望将CommonUtilities包含在内.MyProject还依赖于Oracle.DataAccess.
如果我使用ILMerge并将CommonUtilities合并到单个程序集CommonUtilities.dll中并引用来自MyProject的所有内容进行编译,但我确信我应该从MyProject明确引用Oracle.DataAccess,因为它是依赖项而不是使用合并到CU的程序集.添加对Oracle.DataAccess的引用也会导致使用不明确的语句,因为引用了两个Oracle.DataAccess程序集.
在我的情况下使用ILMerge/Internalize会导致编译错误,因为内部化Oracle.DataAccess程序集中的类型是从CommonUtilities返回的,因为它们被标记为内部MyProject无法识别返回的类型.
使这项工作的唯一方法就是不将这个特定的程序集(Oracle.DataAccess)合并到CommonUtilities中,而只是从MyProject引用它.这反过来又会产生一个新问题:我应该引用哪个Oracle.DataAccess.dll - 与CommonUtils一起分发的依赖关系?
还有其他方法可以解决这一切吗?
简短易用的版本:
一个进程中对给定程序集的每个引用都应引用相同的版本.
如果不这样做,您可能会陷入深深的麻烦,因为版本不匹配导致应用程序的某个部分无法与另一部分通信.
即使使用像log4net这样的"非常私密"的东西,您也可能会错过共享配置空间的可能性,例如对应用程序的所有部分使用通用根记录器.当然,在这种情况下的最后一次调用是 - 一如既往 - 与负责任的开发人员.
另请参阅有关ILMerge和第三方程序集的其他问题.