2

アンマネージC++コードでC#関数をコールバックとして呼び出す必要があります。アンマネージコードをラップするCLI/C++クラスがあります。このCLI/C ++クラスのインスタンスは、C#内に存在します。

C#コードは以下のテキストのようになります。callBackメソッドへの(デリゲート)関数ポインターがあります。CLI_classのCLIインスタンスがあります。addValueChangedCallBack関数で何らかの形で関数ポインターを指定したいと思います。

public Setup(){
    tempFUNC myFuncObj = new tempFUNC(callBack)
    CLI_class c=new CLI_class();
    c.addValueChangedCallBack(myFuncObj)
}

public delegate void tempFUNC(float x);

void callBack(float x){
....
}

次に、CLIコードで次のようなことを行います。

void addValueChangedCallback(void (*ManipCallBack)(float)){
   unmanagedCPPCLASS.addValueChangedCallback(ManipCallBack)

}

関数ポインタをC++ポインタ(*)に変換するにはどうすればよいですか?また、C#クラスはすでにC ++ / CLIプロジェクトを参照して使用しているため、C ++ / CLIプロジェクトでC#プロジェクトを参照することはできません。依存関係の問題はありますか?

いくつかのサイトで「データのマーシャリング」または「相互運用」の使用への参照を見てきました。それらがどのように機能するのか、または私が見たものから正確に何をするのかわかりませんが、これらは私が使用すべきものですか?

4

1 に答える 1

0

両方のプロジェクトを相互に参照させ、System.InteropServices.Runtime.Marshal.GetFunctionPointerForDelegate を使用して関数ポインターを取得できます。

しかし、もし私があなたなら、C# クラスをComVisibleにして、C++ コードで COM インターフェイスを介して C# メソッドを直接呼び出すようにします。そうすれば、C++/CLI ラッパーは必要ありません。あなたが経験しているように、ラッパーは常に苦痛です。C++/CLI には用途がありますが、ラッパーの作成はそうではありません。

于 2012-10-24T22:51:04.070 に答える