C#。如何将消息从不安全的回调传递给托管代码?

时间:2010-03-19 23:34:39

标签: c# interop unsafe

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

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

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

* P.S。我没有互操作或不安全代码的经验。我曾经在8年前用C ++开发,但在那个噩梦般的时候记得很少:)

P.P.S。该应用程序被加载为地狱,原始开发人员声称它每秒处理2mil消息..我需要一个最有效的解决方案。*

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;
}

谢谢。

1 个答案:

答案 0 :(得分: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"));

我希望我做得对。我没有尝试编译它:)