2010-04-06 42 views
0

我想創建一個應用程序可以修改IL中的屬性來創建一個稍微不同的可執行文件。例如,客戶端A在WinForm標籤上運行應用程序和標籤讀取「客戶端A:」。客戶端B運行應用程序並標註「客戶端B」。容易我知道使用配置文件或資源文件,但這不是這個項目的選項。主程序需要能夠根據用戶輸入的某些表單字段動態生成.exe文件。ildasm和動態exe文件

我的解決方案是創建一個獨立的可執行文件,其中包含我需要動態生成的所有元素。然後,我使用ildasm生成IL,並認爲我可以使用這個IL並替代我想要的動態元素。我可以在用戶使用正則表達式等填充表單後在運行時替換那些標記。 問題是,如果我將ILDASM生成的IL文件保存爲exe並嘗試運行它。我只是啓動控制檯,什麼都不做。

我該怎麼做呢?我不想深入研究Reflection,因爲動態.exe是一個非常簡單的,我認爲用ildasm逆向工程IL將是最快捷的方式。

你的想法和指針非常感謝。 Tony

回答

0

現場生成可執行文件嗎?或者,您是否爲客戶生成可執行文件,然後發送結果?

如果您是生成可執行文件的人,可以將客戶特定的數據/代碼放入單獨的DLL中,並將其作爲資源嵌入到可執行文件中,並在發生AppDomain.CurrentDomain.AssemblyResolve事件時加載它。

這樣,您可以對客戶特定的數據進行版本控制。

+0

嗨有, 好主意,但恐怕可執行文件將需要在現場生成:( – TonyNeallon 2010-04-06 14:40:04

+0

我會盡量避免發送客戶特定的數據給客戶,它不打算給。也讓客戶生成一個可執行的聲音有點脆弱,如果出現問題,感覺就像調試是不可能的 如果你要修改一個可執行文件,我會嘗試替換嵌入的資源而不是生成任何東西 只是一個想法,那麼向他們發送一個從web服務器獲取正確可執行文件的下載器應用程序怎麼樣? – 2010-04-07 07:45:01

0

當您說「重新保存」由ildasm創建的文件並運行它時,是否意味着您正在運行通過ilasm(提供的Microsoft IL編譯器)的所有IL文件?如果沒有,你可能想嘗試。執行替換時請務必小心謹慎,因爲IL有一些非常特殊的要求,而ilasm不像csc和vbc這樣的高級編譯器。

您還可以使用Mono.Cecil修改程序集文件,這樣您就不必將IL發送給客戶。

如果您要繼續提供源代碼並編譯它,您可以在不涉及IL的情況下完成相同的任務,因爲該框架中包含csc,因此可以通過發送C#源代碼並將其編譯到現場。