2017-03-10 106 views
0

這裏我正在編寫包裝來調用c#項目中的C++函數。在這裏我沒有使用Dllimport方法。我正在尋找C++/CLR方法。使用C++/CLR方法,我們可以直接將Dll添加到C#項目中。調用具有std :: list作爲參數的C++函數

在我的C++/CLR中,我有一個像下面這樣的函數。

int StartScan(std::list<SomeObject*> *DeviceList);

我想打電話從C#此功能。什麼是從C#調用的等效屬性。 如果我們使用P/Invoke方法,我已經嘗試了LinkedList,它是std :: list的等價屬性。

+4

std :: list是在C++中實現定義的。對於不同的編譯器和編譯器版本,它有不同的實現。 C#沒有辦法與PInvoke匹配。甚至不同的C++編譯器和版本也不能匹配彼此的'std :: list'。 – PaulMcKenzie

+1

[如何使用P/Invoke在C#中返回列表]可能的重複(http://stackoverflow.com/questions/31529316/how-to-return-a-list-in-c-sharp-using-p -invoke) –

+0

也有關:http://stackoverflow.com/questions/1579559/marshalling-net-generic-types –

回答

1

你不能。由於您的問題意味着您使用的是C++/CLR,並且您可以控制該代碼,因此您應該編寫C#應該使用的公共方法,將受管對象作爲參數,然後將內容複製到std::list<SomeObject*>對象您的C++代碼顯然實際需要。

您需要一個託管類型爲T,這相當於您在C++中使用的SomeObject。您必須將這些對象從託管類型克隆到您的std:list

如果您無法更改C++/CLI代碼,那麼您必須編寫一個shim DLL來處理轉換。 P/invoke不知道如何自動執行此操作。


如果你能夠使用STL/CLR庫,如this comment建議,即您可以將您std::庫用途的cliext::庫,那麼它包含的代碼,以幫助這一點。例如,您可以創建一個cliext::list對象,將您的託管List<T>傳遞給其構造函數,並且它將將託管列表的內容複製到cliext::list對象。

例如:How to: Convert from a .NET Collection to a STL/CLR Container

相關問題