是否可以仅使用ILMerge合并依赖项的子集?
我正在尝试一些探索性的事情:
假设我有一个库“coolproject”,它依赖于one.dll
, two.dll
和three.dll
。
我想使用ILMerge将coolproject与one.dll
和two.dll
结合使用,但不是three.dll
。 在合并完成后,我应该有coolproject.dll
和three.dll
。 无论我打算使用coolproject.dll
我都必须引用three.dll
这有可能吗? 每当我尝试它,我得到。 Unresolved assembly reference not allowed: three
。 我通过设置“Copy Local”= false来省略three.dll
。
[编辑]:
执行如下:
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
这不起作用的原因最终变得相当简单: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
我写了一个小工具来解决这个问题。
源代码可以在@ https://github.com/leppie/ReferenceRemover找到。
在你的情况下,它将用作:
ReferenceRemover three.dll "(one|two).*" coolproject.dll
args的解释:
- 大会检查
- 正则表达式匹配引用
- 它需要重定向到的程序集
输出是three.dll
并调整了其引用。
我想你正在寻找/internalize
开关的’exclude’参数。 例如,如果您使用
/internalize:excludes.txt
文件excludes.txt
包含的位置
three.dll
它将内化one.dll
和two.dll
但保留three.dll
作为外部依赖。
以下是一些更详细的博客文章:
- http://www.bjoernrochel.de/2009/07/07/how-to-shoot-yourself-in-the-foot-with-ilmerge/
- http://www.blackwasp.co.uk/ILMergeInternalize.aspx
更新:从文档 :
2.10 ExcludeFile
public string ExcludeFile {get; 组; }
此属性仅与Internalize属性一起使用(第2.12节)。 在调用Merge之前设置此项时,它指示将用于标识未修改其可见性的类型的路径和文件名。 如果Internalize为true,但ExcludeFile为“”,则除主要程序集之外的任何程序集中的所有类型都将变为非公共类型。 设置此属性会隐式将Internalize设置为true。
该文件的内容应该是每行一个正则表达式。 语法是在.NET命名空间System.Text.RegularExpressions中为正则表达式定义的语法。 正则表达式与每个类型的全名匹配,例如“System.Collections.IList”。 如果匹配失败,则会再次尝试使用类型名称前面的程序集名称(用方括号括起来)。 因此,模式“[A]。*”将组件A中的所有类型排除在非公开之外。 (反斜杠是必需的,因为字符串被视为正则表达式。)模式“NT”将匹配名为N的命名空间中名为T的所有类型,无论它们在何处定义。
重要的是要注意正则表达式没有锚定到字符串的开头; 如果需要,请使用适当的正则表达式运算符字符来执行此操作。
2.12内化
public bool Internalize {get; 组; }
这可以控制主程序集以外的程序集中的类型是否已修改其可见性。 如果为true,则在其程序集外部可见的所有非豁免类型都会修改其可见性,以便从合并程序集外部看不到它们。 如果类型的全名与使用.NET正则表达式引擎的ExcludeFile(第2.10节)中的行匹配,则该类型是免除的。