web-dev-qa-db-ja.com

C#アプリケーションとC ++間の通信DLL

現在、オーディオストリーマーを構築しており、WPF C#GUI内の関数を使用するCPP .dllを持っています。

プログラムは、次のようなイベントを処理する必要があります

  • 音量を下げる/上げる
  • イコライザーバンドの操作

ここまでは、名前付きイベントを使用してこの問題に対処しました。 GUIから.dllへのこれらすべてのイベントを処理するより良い方法は何でしょうか?私が使用するイベントシステム(.dllは、WaitForMultipleObjectsを実行しているスレッドを生成します)、または代わりに名前付きパイプを使用する方が良い/賢い/より有益であるか、それともより良い方法でしょうか?

3
user66141

P/Invokeと呼ばれるテクノロジーを使用して、C#からC/C++に直接呼び出すことができます。 P/Invokeを使用すると、C++関数をC#関数のように見せることができます。

これは、MSDNマガジンのこの記事 の簡単な例です

Cメソッドの定義

BOOL MessageBeep(
  UINT uType   // beep type
);

CのメソッドのP/C#で定義を呼び出す

[DllImport("User32.dll")]
static extern Boolean MessageBeep(UInt32 beepType);

C#からCメソッドを呼び出す

MessageBeep(0);

さて、それはシンプルでクリーンではありませんか? .NETベースクラスライブラリの多くは、P/InvokeラッパーとC#ファサードを備えたC/C++コードとして実装されます。 .NETチーム自体は、このタイプの相互運用にCOMではなくP/Invokeを使用しており、シンプルで効率的です。

P/Invokeメソッド定義の記述方法を見つけるための優れたリソースは、 pinvoke.net です。

6
Jay Beavers