2

p/invoke を使用して C# コードにアタッチされた、動作中のアンマネージ C++ DLL があります。

    [DllImport("p2p.dll", EntryPoint = "Start")]
    public static extern void Start();

    [STAThread]
    static void Main()
    {
        Thread th= new Thread(Start);
         th.Start();
....

このようにして、C++ コードから情報を取得できますが、C++ コードが C# 関数をトリガーする必要がある場合、すべての要求をキューに入れてスレッドで C# からチェックするのではなく、スマートな方法でそれを行うにはどうすればよいでしょうか。

4

3 に答える 3

2

マネージC++を使用するか、C ++ライブラリを関連するすべてのエントリポイントに関数ポインタのセット(マネージ側で委任)を渡すことによってC#から初期化することができます。

プログラムの開始時に、イニシャライザを呼び出します。

[DllImport("p2p.dll")]
public static extern void Initialize(Action triggerManagedAction);

Initialize(() => {Console.WriteLine("called from C++");});

そして、その関数のC ++実装では、関数ポインターを覚えておいてください。

使用する前に、ハンス・パッサントとグーグルによるこのテクニックのコメントも読んでください。ここでバグを紹介するのは簡単です。

于 2012-08-20T12:11:01.200 に答える
1

これを行うには、C++と.Netのイベントハンドラー間のプロキシとして機能するマネージC++クラスを作成します。外観は次のとおりです。

  • たとえば、notify()メソッドが呼び出されるICEventHandlerインターフェイスを公開することにより、C++クラスの通知を登録するとします。
  • マネージC++で、ICEventHandlerから派生した、たとえばNotify()と呼ばれるデリゲートを持つクラスを作成します。継承されたICEvenhHandler.notifty()で、Notifyデリゲートを呼び出します。
  • .net Nofityメソッドを使用して、プロキシクラスのインスタンスを作成し、それをC++イベントソースクラスに渡します。

このようにして、C++イベントは.NetNotifyメソッドを起動します。

于 2012-08-20T12:22:32.680 に答える
0

方法の1つは、/clrフラグを使用してC++コードをコンパイルすることです。このSOスレッドには、いくつかの異なる例があります。

于 2012-08-20T12:10:51.633 に答える