2012-03-05 37 views
1

我有一個給定的代碼以非託管C++編寫,我將其作爲資源添加到C#程序中。將非託管EXE作爲資源合併到受管理的C#代碼中

當試圖使用Assembly.Load加載非託管EXE時,我得到一個BadImageFormatException,其InnerException表示「IL格式不正確」(顯然)。

我該如何做這項工作?

我知道使用代碼作爲DLL會更好,但由於某種原因,dll調用的行爲與當我使用System.Diagnostics.Process.Start運行非託管exe的行爲方式不同。

而我不想有兩個分離的EXE文件。任何想法?


編輯: OK,我不再需要做到這一點。我的dll表現出不同的方式,因爲我在不同的環境中使用它(winform而不是控制檯);因此導致問題的函數SetThreadDesktop無法按預期工作。現在要關閉帖子,謝謝所有回答的人。

+0

你想使用這個非託管可執行文件?運行?您必須將嵌入式EXE保存到%TEMP%路徑,並使用Process.Start來完成。然後使用'WaitForExit',並刪除EXE清理。 – vcsjones 2012-03-05 16:51:47

+0

確實是個好主意,但我寧願在不生成嵌入式EXE的情況下進行此項工作 – GianT971 2012-03-05 17:00:55

+2

您應該能夠使用C++/CLI編譯器將C++編譯爲混合模式程序集,並將其與您的C#代碼成一個文件。 – 2012-03-05 17:20:27

回答

3

您無法使用Assembly.Load()加載非託管的exe/dll,它只能與託管的exe一起使用。如果您需要對該非託管文件進行PInvoke,並且您希望單個exe的原因只是部署,則可以將其作爲嵌入資源打包(如您目前所做的那樣),然後在目標機器上解壓縮到一個文件中,然後將其作爲通常。

+0

好的,但也許有人可以給我一個暗示,使這項工作沒有Assembly.Load – GianT971 2012-03-05 16:52:17

+0

@ GianT971我想你已經試圖在打包一個exe之前嘗試遊戲。按照Alexei建議的一些PInvoke教程(+1) – 2012-03-05 17:12:21

+0

請看看這個,明天會給出反饋 – GianT971 2012-03-05 17:19:28

2

如果有非託管DLL作爲資源 - 基本步驟:通過調用方法annotated for PInvoke

+0

你是什麼意思的「在運行時將資源保存到磁盤」?我該怎麼做?* – GianT971 2012-03-05 17:06:35

+0

我們有搜索引擎:) - http://www.bing.com/search?q=Save+resource+to+disk+at+run-time,但這裏有一個http ://stackoverflow.com/questions/864140/write-file-from-assembly-resource-stream-to-disk – 2012-03-05 17:09:40

+0

好吧,你認爲這樣的結果可能會不同,只是將dll導入到項目中? – GianT971 2012-03-05 17:15:21