2013-10-02 52 views
0

我試圖用ILMERGE將庫合併到另一個庫中。ILMERGE輸出小於合併庫

主組件約33 kb大,與其合併的組件約爲5 Mb。 合併後,新組件大小爲1.2 Mb。

我想從理解合併日誌的一些幫助,因爲我不認爲合併的程序集應該是這麼小。

這裏是日誌:

ILMerge版本2.13.307.0 版權所有(c)Microsoft公司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 \爲mscorlib.dll中 運行在Microsoft(R)的.NET Framework v4.0.30319 mscorlib.dll中版本=框架\ v4.0.30319' 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。 ChilkatDotNet45.PeKind = 0 'ChilkatDotNet45'的有效PeKind將被視爲: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'合併到目標組件中。 將組件'ChilkatDotNet45'合併到目標組件中。 從目標程序集中刪除程序集'ChilkatDotNet45'的程序集級別屬性'System.Security.AllowPartiallyTrustedCallersAttribute' 將程序集'EricsConnections_32'中的8個Win32資源複製到目標程序集。 目標程序集的元數據中沒有報告錯誤。 ILMerge:編寫目標程序集'ericsconnectionsM.dll'。 AssemblyResolver:Assembly'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:完成。

怎麼回事?

回答

3

從公司網站:

成分都寫在託管Visual C++

其適當的名稱,C++/CLI更廣爲人知的Chilkat.NET。其中創建混合模式程序集,它們不能合併。 ILMerge不知道如何正確處理這種程序集中的非託管代碼。還值得注意的是你的/ targetplatform命令行參數是錯誤的,它誘導了this failure mode

+0

如果您無法合併混合模式程序集,那麼如何使用此混合模式程序集創建一個程序集?有沒有辦法將這種混合模式程序集作爲資源添加?但是,我如何加載它? – Eric

+1

您需要習慣無法合併C++/CLI程序集的想法。當然,你可以將它合併到一個名爲* setup.exe *的文件中,當然你以前看過這個文件。 –

1

我放棄了ILmerge。嘗試Costura.Fody。只需安裝塊金程序包(如果使用數據包管理器Install-Package Costura.Fody將做到這一點)。而就是這樣。

下次生成時,生成的.exe文件將所有引用合併爲資源,並將自動加載它們。你的輸出目錄仍然包含引用的DLL,但是你的應用程序沒有它們就可以工作。

由於您似乎在使用非託管庫,因此您可能必須在FodyWeavers.xml文件中設置一些選項(它將在安裝塊金程序包時添加到您的項目中)。引用該項目的文檔:

混合模式程序集不能以與託管程序集相同的方式加載。

因此,以幫助Costura確定哪些組件是混合模式,以及在什麼環境加載它們在你應該包括他們的名字在一個或兩個列表。

請勿在名稱中包含.exe或.dll。

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

一定要檢查用於其他用途的情況下該項目page