是否有一个简单的示例,说明如何将消息从不安全的回调传递到托管代码?
我有一个专有的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;
}
谢谢。
答案 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"));
我希望我做得对。我没有尝试编译它:)