1

マネージド c++ dll 経由でアンマネージド c++ dll を使用する C# アプリケーションを作成しました。アンマネージ dll には、そのパラメータの 1 つが であるコールバックがありますstd::string&

これをマネージ dll でラップする正しい方法が見つからないようです。を使用するString^と、コールバックは機能しますが、C# アプリケーションは文字列から何も取得しません。を使用したときString^%、関連していないように見える他の場所で物事がクラッシュし始めました(おそらくメモリ破損)。

だから私の質問は、これを行う正しい方法は何ですか?

ありがとう

4

3 に答える 3

1

ここにコードをコピペすることはできませんが、もう一度説明します。関数を呼び出すのではなく、コールバックに ac# デリゲートを渡すため、マネージ C++ セクションでマーシャリングを使用できません。

アンマネージ dll には、次のような関数を必要とするコールバックがありますvoid Func(unsigned int, int, std:string &)

私の目標は、自分のプログラムからそのコールバックに ac# デリゲートを渡すことです。そのため、アンマネージ コードでは、次のようなデリゲートを作成しましdelegate void DEL(unsigned int a, int b, String ^ c)void mFunc(DEL ^ del)。 . unsigned int と int は問題なく動作しますが、文字列は常に""C# 関数がトリガーされるときです。

于 2009-11-19T06:26:15.233 に答える
0

いくつかのコードを投稿すると、理解が深まり、より良い答えが得られます。ただし、String^ から std::string への自動変換またはマーシャリングはありません。文字列を C# コードに戻すには、自分自身をマーシャリングする必要があります。クイック検索で、これを行う方法の詳細を提供できます。

http://msdn.microsoft.com/en-us/library/42zy2z41.aspx

于 2009-11-18T14:07:14.343 に答える
0

マーシャリングで std::string を扱えるとは思えません。char * を渡す独自のコールバックを作成し、2 つの間のグルー コードを記述する必要があると思います。

また、デリゲートがコールバックにマーシャリングされると、そのコールバックは、デリゲートが作成された可能性のあるオブジェクトへの参照としてカウントされません。したがって、デリゲートが静的メソッドでない場合は、アンマネージ コールバックの存続期間中、どこかに詰め込む必要があります。

于 2009-11-19T22:46:14.857 に答える