2009-05-18 14 views
1

ネイティブC++のDLLを使用しているネイティブC++コードのクライアントアプリケーションがあります。私はこれらのコードをc#dllと接続する可能性を調査しています。これは、書くのがはるかに簡単だからです。私はLoadLibraryでロード可能で、C#DLLへの呼び出しを渡すことができるC++/cliブリッジdllを書くことに決めました。C++とC#コードをC++/cliブリッジで接続する

クライアントとdllとの間の通信は、クライアントがdllがクライアントと通信するインターフェイスオブジェクトへのポインタを渡すようなものです。私はこのオブジェクトをC++コードでラップして、それを使用するためのC#コードを作成しました。

__declspec(dllexport)でいくつかの関数を公開し、それらの呼び出しをc#dllに渡す必要があるため、渡すC#インターフェイスへのポインタが必要です。私はgcroot <>ラッパーでc#オブジェクトを使用したかったのですが、問題はこれらの2つのdllの間に循環依存関係があることです。 C#dllはラッパークラスを使用できるようにブリッジDLLを参照する必要があり、ブリッジDLLはインターフェイスクラスを使用するためにC#dllを参照する必要があります。

私はgcrootでC#オブジェクトをラップするのではなくCOMを使うことができますが、むしろそうしたいと思います。これを回避する方法はありますか?

+0

C#からC++に関数ポイント/イベントまたはデリゲートを渡すことはできません。私はいくつかの高度なタイマーのものについては、C#から簡単にC + +のイベントを処理することができます知っている#。 – CodingBarfield

+1

これは古い投稿ですが、http://stackoverflow.com/questions/13293888/how-to-call-ac-sharp-library-from-native-c-using-c-cli-and-ijwを参照してくださいC++/CLI Wrapperを介して管理されていないコードでC#ライブラリを使用する方法の詳細については、 – amalgamate

答えて

2

C#ではなくC++/CLIでインターフェイスを定義するだけです。これにより、C#プロジェクトへの依存が完全に排除されます。

私は、C++/CLIプロジェクトをラッパー以外のものとして考えることをお勧めします。そこに新しいインターフェイスを定義しないでください。現在のC++コードにあるものを取り出し、 "ref class"でラップして、C#からそれらを構築して呼び出すことができます。

+0

これはまさに私がやっていることです - refクラスにC++コードをラップしてC#dllで使用するようにしています。しかし、ブリッジはC++クライアントからc#dllにもコールを転送する必要があります。これを行うには、ブリッジはC#dllのコードの一部、したがって依存関係を使用する必要があります。私はそれがどのように排除できるかはわかりません。完全に明白な何かが欠けていますか? –

関連する問題