9

我想知道在创建要包含在与依赖项相关的其他项目中的库版本时的启发式方法是什么,以及是否应该包含它们。

我的问题如下:

我有一个 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 分发的依赖项?

还有其他方法可以解决这一切吗?

4

4 回答 4

5

简短易懂的版本:

一个进程中对给定程序集的每个引用都应该引用相同的版本。

如果你不这样做,你可能会陷入大麻烦,因为应用程序的一部分由于版本不匹配而无法与另一部分通信。

即使使用像 log4net 这样的“真正私有”的东西,您也可能会错过共享配置空间的可能性,例如为应用程序的所有部分使用通用的根记录器。当然,在这种情况下,最后的电话是 - 一如既往 - 与负责的开发人员联系。

另请参阅有关ILMerge 和 3rd 方程序集的其他问题。

于 2008-11-03T20:53:06.060 回答
4

我们使用 ILMerge 的最大原因是让我们的混淆步骤更难以逆转。通过使用 /internalize 标志将它们合并在一起,混淆器可以重命名我们合并到父程序集中的公共类和方法。

来自 IL 合并文档:“[Internalize] 控制除了主程序集以外的程序集中的类型是否修改了其可见性。如果为真,则在其程序集之外可见的所有非豁免类型都修改其可见性,以便它们是从合并程序集的外部看不到”

如果程序集是分开的,那么混淆器不会重命名它们。

顺便说一句,Eazfuscator 很棒,而且免费: http ://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Default.aspx

于 2010-02-10T23:05:08.403 回答
1

我们根本不合并库。我看不到将库合并在一起的优势,而只是首先将它们构建在一个程序集中是无法获得的。

我可以看到将库与 EXE 合并的好处。那可能真的很方便。将库合并在一起的问题在于,它们在您的 EXE 中可能具有不同版本的依赖关系,这可能会让同床者感到不舒服。

我不认为将 dll 合并在一起可以被认为是最佳实践,除非您将它们合并到 EXE 中以呈现单个文件而不是多个文件。

于 2008-11-01T01:53:57.157 回答
0

我想将一堆本地化程序集放在一个中可能会有一些优势(我什至不确定你能做到)

我不会合并来自其他供应商的库——因为他们通常有自己的许可,并且更新它们需要您重新分发新版本的代码。

如果您有许多库来保持目录整洁,或者确保某些代码始终与主要执行的程序集一起使用,那么合并您自己的库可能是有利的。

我认为 ILMerge 在将库合并到 EXE 时做得更好,这样您就可以拥有一个文件而不是多个文件。

于 2008-10-31T01:35:20.723 回答