2009-07-28 38 views
1

當我編譯我的一個程序時,會生成一個DLL。 DLL包含軟件顯示的圖像。我製作了另一個軟件,一個配置器。我希望它能夠打開DLL替換橫幅,只有橫幅,圖像與用戶選擇的任何圖像,然後重新編譯爲一個dll。我怎樣才能做到這一點?打開一個DLL並重寫

回答

2

您可能想要使用資源API - UpdateResource和朋友。

+0

你確定,UpdateResource可以改變.NET程序集中的資源嗎?本地DLL和受管資源中的資源格式不相同。 – TcKs 2009-07-28 15:10:39

+0

@TcKs:好點。我真的不知道。 – EFraim 2009-07-28 15:52:52

2

有微軟認可的策略,特別是PE圖像的資源部分。但是,我建議在C中有一個大的數組,它以一個特定的魔法序列開始,並且擴展到一個已知的大小。然後,在替換數組時,搜索魔術序列,然後替換DLL中的字節。

1

Mono - Cecil。 Cecil是工具(API),它允許您更改/重寫程序集的IL代碼。它也應該重寫資源。

0

請注意,您對此的任何處理方法都會產生副作用 - 特別是,它會破壞程序集上的任何代碼簽名。

您可能需要考慮有一個單獨的資源文件,您的程序集加載。這使得它更新微不足道。如果你有多個資源,你甚至可以使用某種簡單的數據庫。

1

您應該考慮使用.NET中提供的內置C#或VB.NET編譯器即時編譯DLL。實現編譯器的確切類是Microsoft.CSharp.CSharpCodeProvider和Microsoft.VisualBasic.VBCodeProvider。兩者都在System.dll程序集中定義。

或者,您也可以使用與.NET Framework一起安裝的csc.exe,vbc.exe和resgen.exe應用程序來生成DLL。

這可以通過使用System.Diagnostics.Process類生成一個進程來完成。使用它,您可以捕獲Console.In和Console.Out流,將控制檯I/O重定向到StreamReader/StreamWriter,以便與Configurator功能緊密集成。儘管如此,我認爲最好的選擇是第一個選項,它使用實際的編譯器類,而不是調用可執行文件(內部也只是調用編譯器類)。

如果一切都失敗了,CodePlex上有一個編譯器構造函數項目可能會有一些用處。它具有諸如PEAssemblyReader和PEAssemblyWriter類(不太清楚確切名稱)的類,但這些類允許讀取和寫入PE文件。 PE代表可移植的可執行文件,是Windows用於執行文件的格式。不過,在這個選項中,您需要確切知道如何修改內存中的PE結構,並寫出修改的PE結構。

我仍然認爲第一個選項是使用的選項,除非在運行時沒有這些DLL的源代碼。