C#からC++(CLIではなくNative)のDLLと連携をしたいと思っています。

(自作のため全てのコードは入手可能です)

C++/NativeのDLLが出力するデータは構造が複雑なために、C#でマーシャリングするのが大変です。
そのためC++/CLIで一度クッションを入れてデータのやり取りを考えています。
C#のEXE -> C++/CLIのDLL -> C++/NativeのDLL
みたいな流れです。

C++/CLIでC++/Nativeをコールして、その結果をC++/Nativeのヘッダーファイルで定義されているクラスとして取得できました。

これをC#に渡したい場合、
C++/CLIのDLLではどんな手段がありますか?

①C++/CLIでC#に渡す用のクラスを定義しないといけない
②C++/Nativeのヘッダーがあるならいい方法がある
③マーシャリングが大変でもC#から直接C++/Nativeを呼ぶほうがマシ。

その他なんでもいい方法があれば教えてください。

・C++/Nativeの出力するオブジェクトはSTLのものを含みます。
・共有メモリやらメモリマップドファイルなどを使ってC++/CLI⇔C++/Nativeの連携が成立しているので、やりとりには多少の処理が必要です。
・.NET2.0で可能なものでお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/11/09 13:05:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:IlO10l0Il No.1

回答回数1757ベストアンサー獲得回数81

id:sarusaruru

すみません。真面目に質問しているので勘弁して下さい。

2008/11/05 19:57:59
  • id:tdoi
    状況がつかめていないのでコメントで。

    まず、気になったのが、

    「共有メモリやらメモリマップドファイルなどを使ってC++/CLI⇔C++/Nativeの連携が成立しているので、やりとりには多少の処理が必要です。」

    とのことですが、C++/CLIのDLLをはさんだのは、データの受け渡しの問題以外に、CLIのDLLとNativeのDLLとで連携処理する必要があるからなのでしょうか?それであれば、CLIのDLLは必須と思われるのですが、これを抜かすこともできるのでしょうか?
    処理の内容(C#とC++/CLIとC++/Nativeに分けた動機も含めて)やどのようなデータをやり取りするのかが分かれば、もう少しつめたコメントができるかもです。

    で、共有メモリなどをやりとりしているということなので、また、質問文から判断すると、データとしては、STLで定義されたオブジェクトや、大きなバイナリデータを含むということでしょうか?


    C++/Nativeを利用しているところから考えると、パフォーマンスが要求されるためなのかと判断したのですが、それであれば、マーシャリングをがんばるだけでよいのであれば、C#からC++/Nativeを直接叩いたほうがよいのではないでしょうか?
    また、やり取りするデータがいくつかあるのであれば、C#とC++/Nativeの間でソケット通信なんかでデータを渡すなんてこもあるのではないでしょうか?

    何かの参考になれば。
  • id:sarusaruru
    C++/NativeのDLLで共有メモリとメモリマップドファイルにデータを格納して、C++/CLIでそれを取り出しています。
    その処理はC#からでも可能です。C++/CLIを抜かすことはできます。

    C++/NativeでDLLを分けたのはパフォーマンスの問題が大きいです。
    ご想像の通り、STLで定義されているオブジェクトも大きなバイナリデータもあります。

    ソケットやシリアライズを通すことも検討はしていましたが、候補としては除外しました。
    渡したいクラスが10種類前後はあるのですが、渡しやすい構造体とSTLを使わないデータ構造で
    定義しなおしてマーシャリングすることも考えてみます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません