2011-09-30 94 views
4

所以我有我的C# WinForm應用程序,從它我打電話給我的C++ CLI MFC dll庫。C++到C#事件處理

但是我的C++庫中有一些事件,即使這個事件發生在這個庫的本地(非CLI)部分。我需要從我的C#應用​​程序調用一些代碼,並在此事件中獲取一些數據。

所以,當這本機的功能是從客戶端調用:

bool __stdcall ClassName::WorkQuery() 
{ 
     ...... 
     switch(pp->code) 
     { 
     case READCOMPLEX: 
         .......... 

我需要從C#帶來的數據,所以我需要以某種方式註冊此作爲事件。

+0

你的活動是什麼樣的?我認爲事件是.Net的事情,而不是C++的事情......你有沒有可以共享的任何示例代碼簽名? –

+0

因此,我的本地C++部分與運行服務器(它甚至不是我的代碼)一樣工作,並且存在標準的C++函數,當客戶端請求某些數據時正在調用它。 – Cynede

+0

那麼「事件」是什麼意思?這是一種應該像事件一樣工作的公共財產嗎?如果是這樣,你能分享它的簽名嗎?或者你只是想知道某個C++函數何時被調用(內部)? –

回答

5

所以問題是你需要運行C#代碼來響應MFC事件(或C++回調),對吧?

爲什麼你不能只註冊一個本地處理程序到本地事件/回調,然後調用一個.NET事件,它可以從C#中消耗掉。

+2

+1;這個答案似乎是一個很好的解決方案。也許代碼示例是有序的 –

1

您可以從C++/CLI事件句柄創建一個.NET事件,然後本地使用它。只需使用EventWaitHandle或派生的AutoResetEvent和ManualResetEvent。

+0

上的描述更好不,我已經有了一個函數,當發生什麼事情時會調用它,我如何將事件追加到它? – Cynede

+0

你讓事件與事件混淆。在非託管的WIN32世界中,事件是發生了某些事情的通知,不要與C#「事件」對象混淆。 EventWaitHandle是WIN32事件的C#版本,可用於偵聽原始事件,然後調用C#「事件」。 –

+0

但首先我需要註冊非託管事件呢? – Cynede