C# 是否可以使用ILMerge仅合并依赖项的子集?
我正在尝试一些探索性的东西: 假设我有一个库“coolproject”,它依赖于C# 是否可以使用ILMerge仅合并依赖项的子集?,c#,ilmerge,C#,Ilmerge,我正在尝试一些探索性的东西: 假设我有一个库“coolproject”,它依赖于one.dll、two.dll和three.dll 我想使用ILMerge将coolproject与one.dll和two.dll结合起来,但不是three.dll。合并完成时,我应该有coolproject.dll和three.dll。无论我打算在哪里使用coolproject.dll我都必须参考three.dll 这可能吗?无论何时我尝试它,我都会得到它不允许未解析的程序集引用:三个。我通过设置“Copy Loc
one.dll
、two.dll
和three.dll
我想使用ILMerge将coolproject与one.dll
和two.dll
结合起来,但不是three.dll
。合并完成时,我应该有coolproject.dll
和three.dll
。无论我打算在哪里使用coolproject.dll
我都必须参考three.dll
这可能吗?无论何时我尝试它,我都会得到它<代码>不允许未解析的程序集引用:三个。我通过设置“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
我想您正在寻找
/internalize
开关的'exclude'参数。例如,如果您使用
/internalize:excludes.txt
其中文件排除.txt
包含
three.dll
它将内部化one.dll
和two.dll
,但将three.dll
作为外部依赖项保留
以下是几篇更详细的博客文章:
我已经写了一个小工具来处理这个问题 源代码可以在@中找到 在您的情况下,它将用作:
ReferenceRemover three.dll "(one|two).*" coolproject.dll
args的解释:
输出为
three.dll
,其引用已调整。这不起作用的原因非常简单:ILMerge必须能够找到从列表中忽略的dll
在评估目标库中的依赖项时,默认情况下,ILMerge会检查各个位置以识别依赖库(\bin、GAC等),即使您从命令行列表中忽略了它。如果找不到此库,则必须使用\lib
开关指定其位置。否则,您将看到不允许的未解析程序集引用:三个错误
例如:
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
你怎么打电话给我?错误消息是正确的IIRC,您确实需要three.dll
在那里(或者ILMerge可以看到它的其他地方),但这并不自动意味着它也被合并了。它是用于WPF项目吗?@Bob这是一个标准C#库。@hvd我正在使用一个构建目标。然而,我刚刚注意到的是这篇文章。虽然它并不完全相关,但它使用一个特殊的目标来确定程序集列表。就你的问题而言,“我正在调用ILMerge(参数)”和“我已经创建了一个调用ILMerge(参数)的构建目标”的意思是一样的:你需要显示参数。这就是我想问的,对不起,如果我不清楚的话。希望落选的选民留下评论。这就是我对我的项目所做的,它工作得很好,不确定这里有什么问题。不确定,但问题不一定与合并项的可见性有关,而是与该项在程序集中的“物理”包含有关。内部化和排除选项不相关。这是将three.dll保留为合并dll中的外部引用,还是将其内部化?这导致three.dll成为外部引用,这是本例的目的。这也可能是解决内部化程序集的类型和命名空间冲突错误的最后解决方案。如果我尝试在/lib:参数中指定DLL,ILMerge将失败,因为“找不到指定的搜索目录'C:\a\b\C.DLL'。您将需要在生成文件中使用项目变量来正确引用该目录(而不是基C:)例如:$(ProjectDir)…\a\b\c.dllit您似乎只能将/lib与目录一起使用?