【问题标题】:ILMERGE output smaller than merged libraryILMERGE 输出小于合并库
【发布时间】:2013-10-02 15:39:18
【问题描述】:

我正在尝试使用 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 将平台设置为“v4”,使用目录“C:\Windows\Microsoft.NET\Framework\v4.0.30319”作为 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 文件。调试信息不​​适用于程序集“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”。 AssemblyResolver:程序集“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” 将 8 个 Win32 资源从程序集“EricsConnections_32”复制到目标程序集。 目标程序集的元数据中没有报告错误。 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:完成。

出了什么问题?

【问题讨论】:

    标签: .net dll .net-assembly ilmerge


    【解决方案1】:

    来自公司的网站:

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

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

    【讨论】:

    • 如果您无法合并混合模式程序集,那么如何使用此混合模式程序集创建单个程序集?有没有办法将此混合模式程序集添加为资源?但是我该如何加载呢?
    • 您需要习惯不能合并 C++/CLI 程序集的想法。当然,您可以随时将其合并到一个名为 setup.exe 的文件中,您肯定以前见过这样做。
    【解决方案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>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多