Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以使用ILMerge仅合并依赖项的子集?_C#_Ilmerge - Fatal编程技术网

C# 是否可以使用ILMerge仅合并依赖项的子集?

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

我正在尝试一些探索性的东西:

假设我有一个库“coolproject”,它依赖于
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
作为外部依赖项保留

以下是几篇更详细的博客文章:

更新:来自:

2.10排除文件

公共字符串ExcludeFile{get;set;}

此属性仅与Internalize属性一起使用(第2.12节)。当在调用Merge之前设置此选项时,它指示将用于标识不修改其可见性的类型的路径和文件名。如果Internalize为true,但ExcludeFile为“”,则除主程序集中之外的任何程序集中的所有类型都将变为非公共类型。隐式设置此属性会将Internalize设置为true

文件的内容应为每行一个正则表达式。语法是在.NET命名空间System.Text.RegularExpressions中为正则表达式定义的语法。正则表达式与每个类型的全名匹配,例如“System.Collections.IList”。如果匹配失败,将使用类型名称前面的程序集名称(用方括号括起来)重试。因此,模式“[A].*”将程序集A中的所有类型排除在非公共模式之外。(反斜杠是必需的,因为字符串被视为正则表达式。)模式“N.T”将匹配名为N的命名空间中名为T的所有类型,无论它们在哪个程序集中定义

需要注意的是,正则表达式没有锚定到字符串的开头;如果需要,请使用适当的正则表达式运算符字符执行此操作

2.12内部化

公共布尔内部化{get;set;}

这将控制是否修改除主程序集中以外的程序集中的类型的可见性。如果为true,则在其程序集外部可见的所有非豁免类型都将修改其可见性,以便在合并程序集外部不可见。如果类型的全名与使用.NET正则表达式引擎的ExcludeFile(第2.10节)中的一行匹配,则该类型将被豁免


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

源代码可以在@中找到

在您的情况下,它将用作:

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与目录一起使用?