是否有可能只使用合并依赖ILMerge的一个子集?(Is it possible to only m

2019-07-18 16:45发布

我想探索的东西:

说我有一个图书馆“coolproject”,它有依赖关系one.dlltwo.dllthree.dll

我想用ILMerge到coolproject结合了one.dlltwo.dll但不是three.dll 。 在合并完成后我应该有coolproject.dllthree.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

Answer 1:

这不工作结束了,而简单的原因: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


Answer 2:

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

源代码可以发现@ https://github.com/leppie/ReferenceRemover 。

在你情况下,将用作:

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

args来说明:

  1. 大会视察
  2. 正则表达式匹配引用
  3. 装配它需要重定向到

输出是three.dll其引用调整。



Answer 3:

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

/internalize:excludes.txt

该文件excludes.txt包含

three.dll

它将内在one.dlltwo.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节)的线。



文章来源: Is it possible to only merge a subset of dependencies using ILMerge?
标签: c# ilmerge