當我編譯我的一個程序時,會生成一個DLL。 DLL包含軟件顯示的圖像。我製作了另一個軟件,一個配置器。我希望它能夠打開DLL替換橫幅,只有橫幅,圖像與用戶選擇的任何圖像,然後重新編譯爲一個dll。我怎樣才能做到這一點?打開一個DLL並重寫
回答
您可能想要使用資源API - UpdateResource和朋友。
有微軟認可的策略,特別是PE圖像的資源部分。但是,我建議在C中有一個大的數組,它以一個特定的魔法序列開始,並且擴展到一個已知的大小。然後,在替換數組時,搜索魔術序列,然後替換DLL中的字節。
看Mono - Cecil。 Cecil是工具(API),它允許您更改/重寫程序集的IL代碼。它也應該重寫資源。
請注意,您對此的任何處理方法都會產生副作用 - 特別是,它會破壞程序集上的任何代碼簽名。
您可能需要考慮有一個單獨的資源文件,您的程序集加載。這使得它更新微不足道。如果你有多個資源,你甚至可以使用某種簡單的數據庫。
您應該考慮使用.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的源代碼。
- 1. 打開並寫入FORTRAN DLL中的文件
- 2. 如何在DLL中打開並執行文件寫入?
- 3. 打開並重新打開exe文件
- 4. 打開並寫入文件
- 5. Perl打開多個文件並並排寫入單個文件
- 6. 打開一個窗口並寫入該窗口
- 7. 打開一個excel文件並將值寫入
- 8. 在函數打開一個文件,並寫入它
- 9. 問題並重新打開
- 10. 如何將dll合併爲一個dll
- 11. 從C#DLL打開控制檯並使用它打印輸出
- 12. 打開一個文件並使用
- 13. 如何打開一個Activity的前一個實例並重新創建它?
- 14. Excel表單打開並迭代寫入
- 15. 打開並寫入文本c
- 16. 打開遠程文件並寫入它
- 17. 打開頁面並填寫表格
- 18. 打開cmd並讀取和寫入它
- 19. Ilmerge導致dll的打開
- 20. jni打開cobol dll調用
- 21. 打開和偵聽DLL
- 22. 打開一個新標籤頁/窗口並寫入一些內容?
- 23. 重寫DLL的方法
- 24. 編寫一個函數來打開一個文件
- 25. MySQL打開並打開表
- 26. 使含有重寫虛擬方法的類,以一個dll
- 27. 打開瀏覽器並填寫一些數據
- 28. TFS - 重新打開合併窗口
- 29. 打開一個QLabel
- 30. 展開節點並打開兩個treeviews
你確定,UpdateResource可以改變.NET程序集中的資源嗎?本地DLL和受管資源中的資源格式不相同。 – TcKs 2009-07-28 15:10:39
@TcKs:好點。我真的不知道。 – EFraim 2009-07-28 15:52:52