0

是否有一个简单的示例说明如何将消息从不安全回调传递到托管代码?

我有一个专有的 dll,它接收一些包装在结构中的消息,所有消息都进入回调函数。

使用示例如下,但它也调用了不安全的代码。我想将消息传递到我的所有托管代码的应用程序中。

*PS 我没有互操作或不安全代码方面的经验。我在 8 年前曾使用 C++ 进行开发,但对那个噩梦般的时代几乎不记得了 :)

PPS 该应用程序加载得非常糟糕,最初的开发人员声称它每秒处理 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 回答