0

安全でないコールバックからマネージド コードにメッセージを渡す方法の簡単な例はありますか?

構造体にパックされたいくつかのメッセージを受信する独自​​の dll があり、すべてがコールバック関数に送られます。

以下に使用例を示しますが、unsafe コードも呼び出します。すべてマネージ コードであるアプリケーションにメッセージを渡したいと考えています。

*PS 相互運用や安全でないコードの経験はありません。私は 8 年前に C++ で開発していましたが、その悪夢のような時代のことはほとんど覚えていません :)

PPS アプリケーションは地獄のように読み込まれます。元の開発者は、1 秒あたり 200 万メッセージを処理すると主張しています。最も効率的なソリューションが必要です。*

static unsafe int OnCoreCallback(IntPtr pSys, IntPtr pMsg)
{
  // Alias structure pointers to the pointers passed in.
  CoreSystem* pCoreSys = (CoreSystem*)pSys;
  CoreMessage* pCoreMsg = (CoreMessage*)pMsg;

  // message handler function.
  if (pCoreMsg->MessageType == Core.MSG_STATUS)
    OnCoreStatus(pCoreSys, pCoreMsg);

  // Continue running
  return (int)Core.CALLBACKRETURN_CONTINUE;
}

ありがとうございました。

4

1 に答える 1

0

Marshal クラスを使用して相互運用コードを処理できます。

例:

C:
void someFunction(int msgId, void* funcCallback)
{
   //do something
   funcCallback(msgId); //assuming that  function signature is "void func(int)"
}

C#
[DllImport("yourDllname.dll")]
static extern someFunction(int msgId, IntPtr funcCallbackPtr);

public delegate FunctionCallback(int msgId);
public FunctionCallback functionCallback;

public void SomeFunction(int msgId, out FunctionCallback functionCallback)
{
   IntPtr callbackPtr;
   someFunction(msgId, callbackPtr);

   functionCallback = Marshal.DelegateToPointer(callbackPtr);
}

you can call as:
SomeFunction(0, (msgIdx) => Console.WriteLine("messageProcessed"));

私はそれが正しかったことを願っています。私はそれをコンパイルしようとしませんでした:)

于 2014-01-14T13:38:59.757 に答える