Вот решение:
1 - Ваша C# dll должна загрузить C ++ SubscribeMessages DLL , которая будет использоваться для уведомления программы, используя метод DispatchEvents
:
using System.Runtime.InteropServices;
namespace MyCSharpDLL
{
class PlatformInvokeTest
{
// Import C++ DLL
[DllImport("SubscribeMessages.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void DispatchEvents();
static void LoadFilterEVENT(/*LoadFilterEVENTMessage msg*/)
{
//FilterValue = msg.Filter;
DispatchEvents();
}
/* Methods in DLL being used below */
public static void Main()
{
LoadFilterEVENT();
}
};
}
2- Функция DispatchEvents
принадлежит SubscribeMessages.dll
(простой проект C ++ dll) выполняет роль бинарного семафора для разблокировки программы C ++:
extern "C" __declspec(dllexport) void DispatchEvents()
{
// Juste open Semaphore
HANDLE ghSemaphore = OpenSemaphore (SEMAPHORE_ALL_ACCESS , TRUE, _T("SemSubscribeMessages"));
if ( NULL == ghSemaphore)
{
MessageBox(NULL,_T("Error when opening semaphore"),_T("Error"),0);
return;
}
// Release semphare in order that CPP program can be notified
ReleaseSemaphore(ghSemaphore, 1, NULL);
}
Наконец, ваша C ++ программа должна ждать на семафоре SemSubscribeMessages
, чтобы иметь возможность получать уведомления.
Поскольку ожидание блокируется, я поместил функцию WaitForSingleObject
в отдельный поток , что обеспечивает большую гибкость для вашей основной программы:
#include <windows.h>
#include <iostream>
using namespace std;
// Init value = 0 to block on the first call
#define INITIAL_COUNT 0
// Max value 1 to be a binarySemaphore
#define MAX_SEM_COUNT 1
DWORD WINAPI ListenNewEvent (LPVOID lpParam )
{
DWORD dwWaitResult;
HANDLE ghSemaphore = CreateSemaphore( NULL, INITIAL_COUNT, MAX_SEM_COUNT, _T("SemSubscribeMessages"));
if ( NULL == ghSemaphore) return -1;
while (true)
{
cout<< _T("Wainting for new Events ...")<<endl;
dwWaitResult = WaitForSingleObject( ghSemaphore, INFINITE);
MessageBox(NULL,_T("New Event arrive ..."), _T("Notification"),0);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwThreadId;
HANDLE hListnerThread = CreateThread( NULL, 0, ListenNewEvent, NULL, 0, &dwThreadId);
WaitForSingleObject (hListnerThread, INFINITE);
return 0;
}
Результат:
При запуске основной программы CPP вы получаете:
![enter image description here](https://i.stack.imgur.com/llK9k.png)
После C# dll отправив уведомление, вы получите:
Если вам нужно также обмениваться данными (помимо событий), вы можете добавить слой «совместно используемой памяти» после уведомлений ... надеясь, что это помогло вам