2012-03-13 63 views
2

我有一個庫,其功能我想最終暴露給.NET。我要揭露的方法具有以下特徵:爲.NET消費定義此本機界面的最佳方式是什麼?

void DoSomething(std::list<SomeStruct>& someList);

變量someList得到由DoSomething填充。

我知道如何從庫中導出。我的主要問題是這個函數的「.NET友好」界面是什麼樣的?我假設std::list是一個壞主意,如果我想用P/Invokes使用C#。

還有其他的選擇嗎?作爲調用者,我不會知道我應該提前通過的緩衝區的大小。而且,作爲調用者,我寧願不使用小的固定大小的緩衝區對函數進行多次調用,也不想傳入超大緩衝區。

這種情況的最佳做法是什麼?

+0

您不能通過pinvoke將C++類暴露給託管代碼。只有C++/CLI可以在這樣的場景下工作。您仍在複製列表元素,除非它是簡單類型,否則這是不可避免的。一個結構並不簡單。 – 2012-03-13 23:25:36

+0

謝謝@HansPassant - 我沒有使用STL列表類,而是使用(本地)動態分配數組來處理。這種方法如何被認爲?它是否太容易犯錯(關於釋放託管端的內存)?這樣的界面是否會通過「笑」因素? – jglouie 2012-03-14 00:07:25

+0

您正在詢問與您在此處發佈的問題完全不同的問題。編輯或重新提問。 – 2012-03-14 00:17:06

回答

2

您可以定義一個用於pinvoke調用的結構體。在本地和中間側面裝飾它,以便兩邊的包裝相同。至於變量大小的out參數,可以使用:: GlobalAlloc分配一個數組,然後可以在C#中取消分配數組。也傳遞一個項目數量。在C#中,Marshal類型具有各種方法來處理GlobalAlloc的數組。

+0

明天我會開始工作,除非別人給出更好的答案,否則我會詳細討論。 – mackenir 2012-03-13 22:34:24

+0

謝謝。我可以從那裏拿起那些東西......但是我想知道這種方法有多「標準」? – jglouie 2012-03-14 00:08:54

+0

那麼,對於完全忘記這件事感到抱歉,但很高興知道它在某種程度上是有用的。至於「標準性」,我真的不確定! – mackenir 2012-03-14 20:41:04

相關問題