將 ILMerge 與 .NET 4 庫一起使用
兩個問題:
1) 基本 .NET 程序集不包含在 ILmerged 程序集中
從 .NET 3.5/Visual Studio 2008 升級到 .NET 4/Visual Studio 2010 後,我在後期建構中使用 ILMerge 時遇到問題。我有一個解決方案,其中包含多個目標框架設置為“.NET Framework 4”的項目. 我使用以下 ILMerge 命令將各個項目 DLL 合併到一個 DLL 中:
if not $(ConfigurationName) == Debug if exist "C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe" "C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe" /lib:"C:\Windows\Microsoft.NET\Framework64\v4.0.30319" /lib:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies" /keyfile:"$(SolutionDir)$(SolutionName).snk" /targetplatform:v4 /out:"$(SolutionDir)bin\development\$(SolutionName).dll" "$(SolutionDir)Connection\$(OutDir)Connection.dll" ...other project DLLs... /xmldocs如果我不指定 .NET 4 框架目錄的位置,我會從 ILMerge 收到“不允許的未解析程序集引用:系統”錯誤。如果我不指定 MSTest 目錄的位置,則會收到“不允許的未解析程序集引用:Microsoft.VisualStudio.QualityTools.UnitTestFramework”錯誤。
上面的 ILMerge 命令工作並生成一個 DLL。但是,當我在另一個 .NET 4 C# 項目中引用該 DLL 並嘗試在其中使用程式碼時,我收到以下警告:
無法解析主要引用“MyILMergedDLL”,因為它間接依賴於 .NET Framework 程序集“mscorlib,Version=4.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”,它的版本“4.0.65535.65535”高於版本目前目標框架中的“4.0.0.0”。
如果我隨後刪除該
/targetplatform:v4標誌並嘗試使用 MyILMergedDLL.dll,則會收到以下錯誤:‘System.Xml.Serialization.IXmlSerializable’ 類型是在未引用的程序集中定義的。您必須添加對程序集“System.Xml,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”的引用。
看來我不應該這樣做。使用我的 MyILMergedDLL.dll API 的人不必添加對它引用的任何庫的引用。我怎樣才能解決這個問題?
2) TypeLoadException 僅在使用合併程序集時
**編輯:**除此之外,即使我
System.Xml在使用 MyILMergedDLL.dll 的消費者項目中添加了對的引用,使用 MyILMergedDLL.dll 中的一些程式碼也會產生此異常:System.TypeLoadException:無法從程序集“MyILMergedDLL,Version=1.0.1.1,Culture=neutral,PublicKeyToken=…”載入類型“System.Func`2”。
這是我的消費者項目中的程式碼;導致的行
TypeLoadException是第二行:var keys = new[] {"a", "b", "c"}; var row = new Row(keys);
Row拋出的特定建構子TypeLoadException在公共類中定義MyILMergedDLL,當我在引用單個項目 DLL 時使用此建構子時,它工作正常。只有當我在引用 IL 合併的 DLL 時使用此建構子時,我才會得到異常。我不知道發生了什麼事。這是建構子:
public Row(IEnumerable<string> keys) : base(keys) { }
base它所指的有以下程式碼:foreach (string key in keys.Where( key => !string.IsNullOrEmpty(key) )) { _dic.Add(key, string.Empty); }
有一個非常新的版本可以解決 x64 問題。如果您仍有問題,請直接與 Mike Barnett 聯繫 (mbarnett at microsoft dot com)
附錄。你的選擇有一些非常非常錯誤的
/lib:"C:\Windows\Microsoft.NET\Framework64\v4.0.30319"地方。在 .NET 4.5 發布之後,這最近讓很多程序員陷入了困境。該目錄不適用於 .NET 4.0 參考程序集。它的內容被 4.5 程序集覆蓋,您不能再使用它來定位 .NET 4.0 安裝。您得到的執行時錯誤非常尷尬,程序無法再找到某些類型。通常轟炸[Extension]屬性,有時轟炸ICommand介面。這些類型以及其他一些類型從一個程序集轉移到另一個程序集。使用正確的參考組件是一項堅如磐石的要求。您必須使用:
/lib:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"調整以匹配您的特定機器和目標框架版本。