ILMERGE输出小于合并库

时间:2013-10-02 15:39:18

标签: .net dll .net-assembly ilmerge

我试图用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.NET \ Framework \ v4.0.30319'将平台设置为' v4'对于mscorlib.dll   在Microsoft(R).NET Framework v4.0.30319上运行   mscorlib.dll版本= 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文件。调试信息将无法用于汇编&ch; chilkatdotnet45.dll'。       成功阅读大会。       ChilkatDotNet45的元数据中没有报告错误。   检查所有输入程序集是否具有兼容的PeKind。       EricsConnections_32.PeKind = ILonly,需要32位       ChilkatDotNet45.PeKind = 0       有效的PeKind为ChilkatDotNet45'将被视为:ILonly   所有输入程序集都具有兼容的PeKind值。   AssemblyResolver:Assembly' 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'。   AssemblyResolver:Assembly' 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'进入目标组装。   合并装配&ChackatDotNet45'进入目标组装。   程序集级别属性' System.Security.AllowPartiallyTrustedCallersAttribute'来自汇编&ChilkatDotNet45'从目标程序集中删除   从程序集中复制8个Win32资源' EricsConnections_32'进入目标组装。       目标程序集的元数据中没有报告错误。   ILMerge:编写目标程序集' ericsconnectionsM.dll'。   AssemblyResolver:Assembly' System'引用程序集&System;配置'。       AssemblyResolver:尝试引用程序集的目录。   找不到PDB文件。调试信息将无法用于汇编和System.Configuration'。   已解决的装配参考' System.Configuration'到' C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ System.Configuration.dll'。 (用于引用Module&#39目录。)   引用模块的位置' 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:完成。

出了什么问题?

2 个答案:

答案 0 :(得分:3)

来自公司的网站:

  

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

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

答案 1 :(得分:2)

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

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

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

  

无法以与托管程序集相同的方式加载混合模式程序集。

     

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

     

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

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

请务必检查项目page以了解其他用例。