2010-05-06 70 views
5

我在Visual Studio中有5個項目的解決方案。它們是:在Visual Studio項目中引用使用ILMerge創建的程序集

  • Foo.Core:核心功能
  • :網絡特定的擴展
  • Foo.Web.Mvc:構建在覈心的頂部Foo.Web
  • 生成的代碼MVC-具體分機
  • Newtonsoft.Json:第三方庫

我想用ILMerge合併Foo.Core,和Newtonsoft.Json到一個單一的組件,叫做Foo。這是很容易的部分。

我遇到的問題是Foo.WebFoo.Web.Mvc都需要引用所有三個合併的程序集。

如果我引用原始程序集,則在執行ILMerge後,它們將具有無效引用。

如果我參考ILMerged程序集,我必須引用一個調試程序集,然後在將所有東西打包之前進行更改,這看起來並不理想。

我試過創建一個名爲Foo的項目,它引用了3個合併的程序集,並用ILmerged程序集替換了它自己的輸出,但這似乎根本不起作用。

有沒有可靠的方法來做到這一點?

回答

2

ILMerge旨在創建一個新的包裝/組件作爲盒裝「產品」(API,Program ...)來簡化裝配管理,如部署,gac參考,裝配可見性等等,以實現所有功能於一身或外部使用,不混合。

我的猜測是,你必須設置一個PostBuildEvent在您的主要裝配/工程(?)如果你在你的Foo.WebFoo.Web.Mvc項目生成一個或PreBuildEvent您的合併Foo將在您的Foo.WebFoo.Web.Mvc引用項目作爲外部裝配。

您可以通過設置一個MsBuild任務使其更加集成在Visual Studio中。 A sample(來自 Stackoverflow)。

+0

是的,我試過這樣做,但無法得到我期待的效果。看起來ILMerge需要在發佈之前保留最後一步,而不是編譯時。 – 2010-05-08 21:00:08

+0

我認爲如果您的項目按照正確的順序構建,就可以實現這一目標。您是否設置了項目依賴關係以確保構建順序? – JoeBilly 2010-05-08 23:41:41

3

我知道我真的很晚纔來到比賽,但我們正在努力解決這個完全相同的問題,這裏是我們如何解決它。

首先,我們編輯了所有未合併或衛星項目的csproj文件,以便根據文件的存在將conditional reference用於外部程序集。在這種情況下,我們將測試合併程序集的存在。然後我們運行了一個構建腳本,它執行以下操作:

  1. 構建解決方案。
  2. 在主要程序集上運行ILMerge,輸出是條件引用中的文件。
  3. 重建解決方案,但是這次因爲合併程序集存在,所以未合併或附屬程序集現在將具有正確的引用。
+0

這是上述概念的一個例子。一定要看看ProjectReference和Reference標籤: https://github.com/joliver/EventStore/blob/5fce28b92fa875ea8acdfea387161abdee3c8b00/src/proj/EventStore.Persistence.RavenPersistence/EventStore.Persistence.RavenPersistence.csproj – 2011-01-07 17:01:10

相關問題