C #. Как передать сообщение из небезопасного обратного вызова в управляемый код? - PullRequest
0 голосов
/ 20 марта 2010

Есть ли простой пример того, как передавать сообщения из небезопасного обратного вызова в управляемый код?

У меня есть собственный dll, который получает некоторые сообщения, упакованные в структуры, и все приходит к функции обратного вызова.

Пример использования следующий, но он также вызывает небезопасный код. Я хочу передать сообщения в мое приложение, которое полностью управляется кодом.

* P.S. У меня нет опыта взаимодействия или небезопасного кода. Я имел обыкновение разрабатывать на C ++ 8 лет назад, но очень мало помню о тех кошмарных временах:)

P.P.S. Приложение загружается как ад, оригинальные разработчики утверждают, что оно обрабатывает 2 миллиона сообщений в секунду. Мне нужно наиболее эффективное решение.

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 голосов
/ 14 января 2014

Вы можете использовать класс 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"));

Надеюсь, я все сделал правильно. Я не пытался его скомпилировать:)

...