2011-03-22 67 views
1

我有一個「本地」DLL,它帶有一些很好的函數,可以返回(並接受)指向根據特定C結構格式化的數據的指針。調用返回(並接受)指向結構的指針的本地DLL函數

在我的C#程序中,我不關心struct內部結構,我只想獲取並傳遞它們到本機函數。我已經設法鎖定DLL中的函數。 對於指針,我想過使用void *(作爲「未知指針」),因爲我真的不在乎指向結構的內部字段,我只需要存儲和使用指針將它傳遞給DLL庫函數。

但是,對於許多不同類型的數據使用void *會使我的代碼無法閱讀!有沒有什麼辦法在C#中typedef void * some_nicer_type_t?或者做那樣的事情?

回答

2

您可以考慮使用IntPtr代替。

MSDN

,用於 來表示的指針或手柄的特定於平臺的類型。

這也可能最終幫助您編寫非unsafe代碼。

編輯:

爲了滿足您的期望需要在這個問題評論重申,有一件事我可能會建議(雖然沒有提出這是理想的)是定義一個structclass這基本上是一個包裹一個指針:

public struct TypedPointer 
{ 
    public IntPtr UnderlyingPointer; 
} 

正如你帶來了,這可能導致包裝更多的代碼,以擁有這一切符合使用和您想要使用的美感。

+0

謝謝,但IntPtr始終是IntPtr的一切。它可以更清潔,但對我來說,它就像void *一樣混亂無味。我試過typedef IntPtr someothertype_t但它不能編譯。我怎樣才能定義新類型?我想我應該使用一些解決方法,比如在一些對象中包裝IntPtr,然後使用包裝器來實現這些功能。恩,很煩人。 – gd1 2011-03-22 11:38:55

+0

@Giacomo:更新了我的答案,但實際上它只是與您更新的評論重疊。 – 2011-03-22 11:45:09

+0

謝謝你的熱心幫助和關注。這個解決方案是可以做到的最好的。 – gd1 2011-03-22 11:48:55

1

IntPtr的

是要走的路。
只有你必須小心的是內存管理。不安全或不 - C#需要一個引用,否則它遲早會被垃圾收集 - 也可能是當其中一個外部dll使用它時。因此,您需要確保在C#端保持對IntPtr的引用的時間長度。

+0

我會這樣做 – gd1 2011-03-22 11:50:17

相關問題