0

我正在尝试使用 ILMERGE 将一个库合并到另一个库中。

主程序集大约 33 kb 大,要与其合并的程序集大约 5 Mb。合并后,新程序集的大小为 1.2 Mb。

我需要一些帮助来理解合并中的日志,因为我认为合并的程序集不应该小得多。

这是日志:

ILMerge 版本 2.13.307.0 版权所有 (C) Microsoft Corporation 2004-2006。版权所有。ILMerge /lib:C:\Windows\Microsoft.NET\Framework\v4.0.30319 /lib:C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\PublicAssemblies /t:dll /log:merge.log /zeropekind /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /out:ericsconnectionsM.dll ericsconnections_32.dll chilkatdotnet45.dll 使用目录“C:\Windows\Microsoft”将平台设置为“v4”。 NET\Framework\v4.0.30319' for mscorlib.dll Running on Microsoft (R) .NET Framework v4.0.30319 mscorlib.dll version = 4.0.0.0 输入程序集的列表是:ericsconnections_32.dll chilkatdotnet45.dll 试图从文件'C:\Users\eervawo\Documents\Visual Studio 2010\Projects\EricsConnections\EricsConnections\bin\Debug\ericsconnections_32.dll'。在汇编中成功读取。EricsConnections_32 的元数据中没有报告错误。试图从文件“C:\Users\eervawo\Documents\Visual Studio 2010\Projects\EricsConnections\EricsConnections\bin\Debug\chilkatdotnet45.dll”中读取程序集。找不到 PDB 文件。调试信息不​​适用于程序集“chilkatdotnet45.dll”。在汇编中成功读取。ChilkatDotNet45 的元数据中没有报告错误。检查所有输入程序集是否具有兼容的 PeKind。EricsConnections_32.PeKind = ILonly, Requires32bits ChilkatDotNet45.PeKind = 0 'ChilkatDotNet45' 的有效 PeKind 将被认为是: ILonly 所有输入程序集都有一个兼容的 PeKind 值。AssemblyResolver:程序集“EricsConnections_32”正在引用程序集“System.Xml.Linq”。AssemblyResolver:尝试引用程序集的目录。AssemblyResolver:在引用程序集的目录中未找到程序集。AssemblyResolver:正在尝试输入目录。AssemblyResolver:在输入目录中未找到程序集。AssemblyResolver:尝试用户提供的目录。将程序集引用“System.Xml.Linq”解析为“C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Xml.Linq.dll”。(使用客户端提供的目录。)找不到 PDB 文件。调试信息将不适用于程序集“System.Xml.Linq”。组装解析器:组装' EricsConnections_32' 正在引用程序集“System.Core”。AssemblyResolver:尝试引用程序集的目录。AssemblyResolver:在引用程序集的目录中未找到程序集。AssemblyResolver:正在尝试输入目录。AssemblyResolver:在输入目录中未找到程序集。AssemblyResolver:尝试用户提供的目录。将程序集引用“System.Core”解析为“C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Core.dll”。(使用客户端提供的目录。)找不到 PDB 文件。调试信息不​​适用于程序集“System.Core”。将程序集“EricsConnections_32”用于目标程序集的程序集级属性。将程序集“EricsConnections_32”合并到目标程序集中。将程序集“ChilkatDotNet45”合并到目标程序集中。正在从目标程序集中删除程序集“ChilkatDotNet45”中的程序集级属性“System.Security.AllowPartiallyTrustedCallersAttribute” 将程序集“EricsConnections_32”中的 8 个 Win32 资源复制到目标程序集中。目标程序集的元数据中没有报告错误。ILMerge:编写目标程序集“ericsconnectionsM.dll”。AssemblyResolver:程序集“System”正在引用程序集“System.Configuration”。AssemblyResolver:尝试引用程序集的目录。找不到 PDB 文件。调试信息将不可用于程序集“System.Configuration”。将程序集引用“System.Configuration”解析为“C:\Windows\Microsoft.NET\Framework\v4.0”。30319\System.Configuration.dll'。(使用引用模块的目录。)引用模块 'KERNEL32.dll' 的位置是'' 引用模块'' 的位置是'' 引用程序集'mscorlib' 的位置是'C:\Windows\Microsoft.NET\Framework\v4。 0.30319\mscorlib.dll' mscorlib 的元数据中没有报告错误。引用程序集“Microsoft.VisualBasic”的位置是“C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.VisualBasic.dll”Microsoft.VisualBasic 的元数据中没有报告错误。引用程序集“System.Xml.Linq”的位置是“C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Xml.Linq.dll” System.Xml.Linq 的元数据中没有报告错误。引用程序集“System.Core”的位置是“C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Core.dll” System.Core 的元数据中没有报告错误。引用程序集“System.Data”的位置是“C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll” System.Data 的元数据中没有报告错误。引用程序集“系统”的位置是“C:\Windows\Microsoft.NET\Framework\v4.0.30319\system.dll”系统的元数据中没有报告错误。ILMerge:完成。\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll' System.Data 的元数据中没有报告错误。引用程序集“系统”的位置是“C:\Windows\Microsoft.NET\Framework\v4.0.30319\system.dll”系统的元数据中没有报告错误。ILMerge:完成。\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll' System.Data 的元数据中没有报告错误。引用程序集“系统”的位置是“C:\Windows\Microsoft.NET\Framework\v4.0.30319\system.dll”系统的元数据中没有报告错误。ILMerge:完成。

出了什么问题?

4

2 回答 2

3

来自公司网站:

Chilkat.NET 组件是用托管 Visual C++ 编写的

以其专有名称 C++/CLI 更为人所知。这会创建混合模式程序集,它们无法合并。ILMerge 不知道如何正确处理此类程序集中的非托管代码。另外值得注意的是,您的 /targetplatform 命令行参数是错误的,它会导致这种故障模式

于 2013-10-02T16:53:31.420 回答
2

我放弃了 ILmerge。试试 Costura.Fody。只需安装 nugget 包(如果使用包管理器Install-Package Costura.Fody就可以了)。就是这样。

下次构建时,生成的 .exe 会将所有引用合并为资源,并自动加载它们。您的输出目录仍将包含引用的 DLL,但您的应用程序将在没有它们的情况下运行。

由于您似乎在使用非托管库,因此您可能必须在FodyWeavers.xml文件中设置一些选项(当您安装 nugget 包时,它将被添加到您的项目中)。引用项目的文档:

混合模式程序集的加载方式不能与托管程序集相同。

因此,为了帮助 Costura 识别哪些程序集是混合模式的,以及在什么环境中加载它们,您应该将它们的名称包含在这些列表中的一个或两个中。

不要在名称中包含 .exe 或 .dll。

<Costura>
    <Unmanaged32Assemblies>
        Foo32
        Bar32
    </Unmanaged32Assemblies>
    <Unmanaged64Assemblies>
        Foo64
        Bar64
    </Unmanaged64Assemblies>
</Costura>

请务必查看项目页面以了解其他用例。

于 2016-09-21T15:19:08.080 回答