我想探索的东西:
说我有一个图书馆“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
。 我省略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,海关总署等),即使你在命令行中忽略它。 如果找不到这个库,你必须使用指定其位置\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
开关。 例如,如果您使用
/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
公共字符串ExcludeFile {获得; 组; }
此属性用于仅在与所述内化特性(第2.12节)结合使用。 当此调用合并之前设置,表示将用来识别不要求具有自己的知名度修改类型的路径和文件名。 如果内化是真实的,但ExcludeFile是“”,然后在比初始组件以外的任何组件的所有类型由非公有制。 设置该属性隐式设置内在为true。
该文件的内容应该是每行一个正则表达式。 语法是,在.NET命名空间System.Text.RegularExpressions对正则表达式定义。 正则表达式是对每种类型的全名相匹配,例如,“System.Collections.IList”。 如果匹配失败时,它与该组件名称(用方括号包围)试图再次预置到类型名称。 因此,模式“[A]。*”被设为非公开的不包括在组件中的所有类型。 (需要有反斜杠,因为该字符串为正则表达式处理)模式“NT”将匹配名为N无论命名空间,只在定义什么是汇编名为t的所有类型。
值得注意的是,正则表达式不固定到字符串的开始是很重要的; 如果需要的话,使用适当的正则表达式的操作符字符这样做。
2.12内在
公共BOOL内在{获得; 组; }
这控制类型除主组件其他组件是否具有它们的可见性修改。 当它是真实的,那么所有非豁免类型是其装配的外部可见有自己的知名度修改,使它们不从合并组件外部可见的。 A型是豁免如果它的全名与从使用.NET正则表达式引擎的ExcludeFile(第2.10节)的线。