2008-10-13 51 views
1

我在C#應用程序中從非託管DLL mscorpe.dll導入CreateICeeFileGen()函數,以便生成PE文件。這個函數返回一個指向C++對象的指針defined here,有沒有什麼辦法可以通過C#從這個類中訪問字段,還是我需要編寫一個非託管的包裝器DLL?在C#中使用P/Invoke通過指針實例化C++類

我目前使用的代碼如下: -

[DllImport(@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorpe.dll", EntryPoint = "CreateICeeFileGen")] 
static extern void CreateICeeFileGen(out IntPtr iceeFileGenPointer); 
... 
IntPtr filePtr; 
CreateICeeFileGen(out filePtr);  

注::我知道你可以用.net庫做類似的事情,但我需要爲我的目的使用非託管庫。

在此先感謝!

回答

2

您需要一個包裝庫來使用C#中的類。

最好的選擇是使用C++/CLI創建包裝器,它可以直接調用非託管函數並使用託管類來顯示細節。這將消除對任何事物使用P/Invoke的需要。 (好吧,從技術上講,如果你知道類的佈局,你可能會用指針算術來訪問字段,但這會非常脆弱和凌亂,並且試圖以這種方式調用虛擬函數會非常難看)。

+0

非常感謝,效果很好,但是因爲我想做COM互操作,我更喜歡它作爲ICeeFileGen傳遞指針的一個非常小的包裝。不幸的是,這意味着我的圖書館必須使用不安全的代碼... grrr ...無論如何!有用!謝謝!! – ljs 2008-10-13 16:06:12

0

它看起來像COM類/接口。你不能只用COM來代替嗎?

+0

據我所知,它不是COM,因爲它定義爲一個C++類而不是COM接口,儘管它混淆了它的類名前綴。它將使用COM更容易...! – ljs 2008-10-13 14:26:15