我正在尝试探索性的事情:
假设我有一个库“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
答案 0 :(得分:8)
这不起作用的原因最终变得相当简单: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
答案 1 :(得分:0)
我认为您正在寻找/internalize
切换的'exclude'参数。例如,如果您使用
/internalize:excludes.txt
文件excludes.txt
包含
three.dll
它会内化one.dll
和two.dll
,但会留下three.dll
作为外部依赖。
以下是一些更详细的博客文章:
更新:来自documentation:
2.10 ExcludeFile
公共字符串ExcludeFile {get;组; }
此属性仅与Internalize属性一起使用(第2.12节)。在调用Merge之前设置它时,它指示将用于标识未修改其可见性的类型的路径和文件名。如果Internalize为true,但ExcludeFile为“”,则除主要程序集之外的任何程序集中的所有类型都将变为非公共类型。设置此属性会隐式将Internalize设置为true。
文件的内容应该是每行一个正则表达式。语法是在.NET命名空间System.Text.RegularExpressions中为正则表达式定义的语法。正则表达式与每个类型的全名匹配,例如“System.Collections.IList”。如果匹配失败,则再次尝试使用类型名称前面的程序集名称(用方括号括起来)。因此,模式“[A]。*”将组件A中的所有类型排除在非公开之外。 (反斜杠是必需的,因为字符串被视为正则表达式。)模式“N.T”将匹配名为N的命名空间中名为T的所有类型,无论它们在何处定义。
重要的是要注意正则表达式不会锚定到字符串的开头;如果需要,请使用适当的正则表达式运算符字符。
2.12内部化
public bool Internalize {get;组; }
它控制主程序集以外的程序集中的类型是否已修改其可见性。如果为true,则在其程序集外部可见的所有非豁免类型都会修改其可见性,以便从合并程序集外部看不到它们。如果类型的全名与使用.NET正则表达式引擎的ExcludeFile(第2.10节)中的行匹配,则该类型是免除的。
答案 2 :(得分:0)
我写了一个小工具来解决这个问题。
可以在@ https://github.com/leppie/ReferenceRemover找到源代码。
在您的情况下,它将用作:
ReferenceRemover three.dll "(one|two).*" coolproject.dll
args的解释:
输出为three.dll
,其参考值已调整。