2012-01-22 46 views
1

是否有人成功iLMerged Enterprise Library 5.0? iLMerge成功地創建了合併的dll和我的MVC應用程序編譯,但發動我收到以下錯誤的應用程序時:iLMerge Enterprise Library 5.0

SecurityTransparent and SecurityCritical attributes cannot 
be applied to the assembly scope at the same time. 
+0

只是出於好奇,爲什麼你想合併DLL的? – Lloyd

+0

不幸的是,我們的開發團隊幾年前做出了對iLMerge我們使用的大多數第三方庫的決定,因爲我們共有大約50個需要引用這些dll的項目。他們認爲在每個項目中引用一個dll而不是引用每個dll會更容易。這是我們仍然付出的決定,因爲每當我們發現問題時都會讓我頭疼。 – PCG

回答

4

如果您編寫了所有要合併的程序集,並且您知道沒有一個ILMerge他們正在對裝配組織進行假設。但在許多情況下(尤其是涉及大量反射或動態語言運行時的情況),ILMerge不起作用。有時候事情會以令人驚訝和神祕的方式失敗。

當ILMerge失敗時,Jeffrey Richter h a more reliable way to get applications with multiple DLL dependencies to be deployable as a single assembly

通過他的方法,每個組件都可以保留自己的名稱,強名和屬性,這大大提高了結果應用程序正常工作的機率。

這不是沒有權衡,但即使ILMerge作者Mike Barnett在該博客文章的評論主題中也表示:「作爲ILMerge的作者,我認爲這太棒了!如果我知道這個,我永遠不會寫ILMerge。「

如果你可以使用里克特的方法,你將不會在大部分的反射或動態陷阱中絆倒。

實施步驟

  1. 嵌入所有你在你的應用程序的資源依賴於第三方組件。
  2. 註冊ResolveEventHandlerAppDomain.CurrentDomain.AssemblyResolve事件。
  3. 當您的處理程序被您在「資源」中存儲的程序集調用時,加載程序集。

你做第3部分如下:

var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name); 
return Assembly.Load(new BinaryReader(resourceStream).ReadBytes(int.MaxValue)); 
+0

在我的控制檯應用程序項目中,我沒有引用程序集屬性上的「生成操作」選項。那麼,我應該如何將它們設置爲「嵌入式資源」。 ? –

0

嘗試合併只有那些應用程序的一部分的DLL文件,而不是框架的人(系統。 Web.Mvc.dll,System.Web.Routing.dll和System.Web.Abstractions.dll)

相關問題