2011-10-06 79 views
1

有什麼辦法可以預編譯MSIL文件,然後在編譯時將.net鏈接器鏈接到.net程序集中?例如,將預編譯的MSIL文件鏈接到程序集中?

因此,例如。我有一個項目。我編譯它,反編譯爲MSIL,並調整MSIL。

現在,我想編譯並鏈接那個微調的msil文件到另一個項目中。

是的,我+對+重新編譯它作爲一個單獨的組件,只是引用它,但在這種特殊情況下,我不能這樣做。 MSIL的內容實際上需要在目標程序集中。

任何想法,如果這是可能的?到目前爲止,我沒有找到任何運氣。

- EDIT-- 一個建議是ILMerge,這可能會奏效。我現在將抓取最新的副本,並會看到這些展會。我遇到的唯一問題是,在過去,我發現合併後調試很困難(或者至少比我沒有使用ILmerge更困難)。我希望可以調整proj文件以將編譯後的MSIL作爲構建過程的一部分直接包含在內,因此所有內容都可以繼續在IDE中輕鬆調試。

- 編輯 - 嘛,看起來並不像ILMerge將對於這種情況 第一份工作,我得到這個消息: 合併過程中出現的異常:(任務id:32) ILMerge.Merge:裝配'Blah'未標記爲僅包含託管代碼。 (TaskId:32) (考慮使用/ zeroPeKind選項 - 但首先閱讀文檔!)(TaskId:32) at ILMerging.ILMerge.Merge()(TaskId:32) at ILMerging.ILMerge.Main(String [] args)(TaskId:32)

好的。所以,到底是什麼,我加入/ zeropekind並重試。

沒有錯誤!

但是,在這種特殊情況下,被合併的DLL在MSIL中調整了幾個函數,將其導出爲CDECL函數。在合併的dll中,它們不再被導出。

大鼠。

回到原點。

回答

2

您可以使用ILMerge將多個程序集合併爲一個,因此您可以調整您的msil,使其成爲一個獨立的程序集,然後將它組合成第一個程序集。

另一種選擇是將你的微調MSIL作爲嵌入式資源加載到你的第一個程序集中(這意味着你的微調msil程序集必須在引用它之前創建)然後在運行時你可以讀取字節[ ]的嵌入式資源加載到一個Assembly中,並加載到AppDomain中。

第三,更激烈的方法將是反編譯兩個組件,並且輸出MSIL文件合併成1,並將其重建成組件。你只需要注意兩組msil代碼之間的命名衝突,但是因爲你可以把msil轉儲到一個純文本文件中,所以編寫一些實用程序來重新組合它們應該不是那麼困難......儘管,那基本上正是ILMerge是,除了它具有2集開始,而不是在一個文本文件的MSIL代碼,...

+0

是啊,我拉ilmerge和我要去嘗試。我希望+可以調整proj文件,讓構建過程本身在構建過程中直接編譯和/或鏈接msil文件。 ilmerge的問題在於合併後的調試可能會非常棘手。 – DarinH

+0

您是否嘗試過構建後任務?您應該能夠在每次構建完成後運行ilmerge.exe。 – CodingWithSpike

相關問題