2017-03-10 12 views
0

ここでは、C#projectのC++関数を呼び出すラッパーを記述しています。ここではDllimportメソッドを使用していません。私はC + +/CLRのアプローチを探しています。 C++/CLRアプローチを使用して、C#プロジェクトにDllを直接追加できます。パラメータとしてstd :: listを持つC++関数を呼び出す

私のC++/CLRには以下のような機能があります。

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

私はC#からこの関数を呼び出したいです。 C#から呼び出す同等のプロパティは何ですか? 私はP/Invoke Approachを使用した場合、std :: listの同等のプロパティであるLinkedListを試しました。

+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を使用していることを意味し、そのコードを制御することができるので、管理されたList<T>オブジェクトをパラメータとして使用するために使用されるパブリックメソッドC22を記述して、内容をstd::list<SomeObject*>オブジェクトあなたのC++コードが明らかに実際に必要とするものです。

Tの管理タイプが必要です。これは、C++で使用しているSomeObjectに相当するものです。これらのオブジェクトを管理対象のタイプからstd:listに複製する必要があります。

C++/CLIコードを変更できない場合は、変換を処理するシムDLLを作成する必要があります。 P/invokeはこれを自動的に行う方法を知らない。


あなたはすなわち、this commentに推奨されているように、STL/CLRライブラリを使用することができるならば、あなたがcliext::ライブラリにあなたのstd::ライブラリの使用法を切り替えることができ、それがこれを支援するためのコードが含まれています。たとえば、cliext::listオブジェクトを作成し、管理対象のList<T>をそのコンストラクタに渡すと、管理対象リストの内容がcliext::listオブジェクトにコピーされます。例えば

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

関連する問題