11

我正在尝试一些探索性的东西:

假设我有一个库“coolproject”,它依赖于one.dlltwo.dllthree.dll.

我想使用 ILMerge 将 coolproject 与one.dlland two.dllbut NOT结合起来three.dll。在合并完成时,我应该拥有coolproject.dlland three.dll。无论我打算在哪里使用coolproject.dll,我还必须参考three.dll

这甚至可能吗?每当我尝试它时,我都会得到。Unresolved assembly reference not allowed: three. 我three.dll通过设置“复制本地”= false 来省略。

[编辑]:

执行如下:

ILMerge /targetplatform:v2 /log /internalize /out:bin\coolproject.dll obj\Debug\coolproject.dll C:\Users\Nick\Projects\test\bin\one.dll C:\Users\Nick\Projects\test\bin\two.dll
4

3 回答 3

9

这不起作用的原因很简单:ILMerge 必须能够找到您从列表中省略的 dll。

在评估目标库中的依赖项时,ILMerge 默认会检查各个位置以识别依赖库(\bin、GAC 等),即使您从命令行列表中省略了它也是如此。如果它找不到这个库,你必须使用\lib开关指定它的位置。否则你会看到Unresolved assembly reference not allowed: three错误。

例子:

ILMerge /lib:..\three\bin\three.dll /targetplatform:v2 /log /internalize /out:bin\coolproject.dll obj\Debug\coolproject.dll C:\Users\Nick\Projects\test\bin\one.dll C:\Users\Nick\Projects\test\bin\two.dll
于 2013-02-06T17:36:19.003 回答
0

我认为您正在寻找/internalize开关的“排除”参数。例如,如果您使用

/internalize:excludes.txt

文件excludes.txt包含在哪里

three.dll

它将内化one.dll,但作为外部依赖two.dll离开。three.dll

以下是一些更详细的博客文章:

更新:来自文档

2.10 排除文件

公共字符串 ExcludeFile { 获取;放; }

此属性仅与 Internalize 属性一起使用(第 2.12 节)。在调用 Merge 之前设置此项时,它指示将用于标识不修改其可见性的类型的路径和文件名。如果 Internalize 为真,但 ExcludeFile 为 "",则除主程序集之外的任何程序集中的所有类型都将变为非公共类型。设置此属性会隐式地将 Internalize 设置为 true。

文件的内容应该是每行一个正则表达式。语法是在 .NET 命名空间 System.Text.RegularExpressions 中为正则表达式定义的。正则表达式与每个类型的全名匹配,例如“System.Collections.IList”。如果匹配失败,则在类型名称前面加上程序集名称(用方括号括起来)再次尝试。因此,模式“[A].*”将程序集 A 中的所有类型排除在非公开之外。(反斜杠是必需的,因为字符串被视为正则表达式。)模式“NT”将匹配命名空间 N 中所有名为 T 的类型,无论它们是在哪个程序集中定义的。

需要注意的是,正则表达式并不锚定在字符串的开头;如果需要,请使用适当的正则表达式运算符字符来执行此操作。

2.12 内化

公共布尔内部化{获取;放; }

这控制是否修改主程序集以外的程序集中的类型的可见性。如果为真,则所有在其程序集外可见的非豁免类型都会修改其可见性,以便从合并程序集的外部看不到它们。如果一个类型的全名与使用 .NET 正则表达式引擎的 ExcludeFile(第 2.10 节)中的一行匹配,则该类型是豁免的。

于 2013-01-25T06:39:31.447 回答
0

我写了一个小工具来处理这个问题。

源代码可以在@https ://github.com/leppie/ReferenceRemover找到。

在您的情况下,它将用作:

ReferenceRemover three.dll "(one|two).*" coolproject.dll

参数说明:

  1. 组装检查
  2. 正则表达式匹配引用
  3. 它需要重定向到的程序集

输出已three.dll调整其参考值。

于 2013-01-25T06:50:31.123 回答