2010-04-08 57 views
2

我正在將一些ISO C++數據類型公開給.Net(在Linux上是單精確的)。使用ISO C++回調註冊委託函數(在單聲道)

爲了簡便起見,我將引用C#在我的問題,雖然我的問題涉及到所有的.NET語言(C#和VB.Net是我的目標語言)。

到目前爲止,我已經制定了如何暴露ISO C++數據類型在C#類(ES)爲單聲道使用 - 由於一些在這裏,因此聰明的傢伙。

到目前爲止,唯一的問題是如何處理的C++回調。在.Net語言(C#和Vb.Net)中,我相信'代表'是等效的回調。

用C#堅持現在,任何人都可以推薦的方式,我可以註冊我的ISO C++代碼的C#委託功能。

的ISO C++代碼是一個通知庫,並且我希望能夠以「推」的通知給單框架(即C#代表在這種情況下)。

我的基本假設是,實現這一點的機制/步驟對於.Net語言來說是一樣的 - 我只需要用.Net語言選擇代碼實際的代表 - 這個假設是否正確?

最後但並非最不重要的是線程安全的問題。我公開的.Net(基本單元更具體)的基礎ISO C++代碼既是重要的,也是線程安全的 - 我必須做任何「額外」的事情來從我的ISO C++代碼調用.Net委託嗎?

回答

1

只要確保您在C++中定義和使用的函數指針具有C鏈接。 然後,您可以導出一個將函數指針作爲參數的C函數,然後您可以使用C#中的委託作爲參數來調用該函數。

從C++方面,你將只通過函數指針調用正常。

請注意,只要可以調用C回調,可能會將委託存儲在靜態變量或類似變量中(如果要將C回調存儲爲在晚於註冊時間。至於其餘的,你不能安全地從信號處理程序中調用託管代碼:除了那個,只要你的託管代碼是可重入且線程安全的,那麼delgate/callback組合也是如此。

+0

@lupus:謝謝你的回答(它是我 - OP)。不幸的是,我似乎失去了基於會話的登錄信息,因此我無法將此答案標記爲已接受 - 即使它有幫助。 – skyeagle 2010-04-09 08:44:03

+0

@lupus:你能指點我一些文檔,提供了一個這樣做的例子嗎? – skyeagle 2010-04-09 08:46:05

+1

我有兩個聯繫在一起,你應該能夠弄清楚,我會想。第一個來自MSDN,並簡要介紹瞭如何使用委託進行回調:。第二個是使用GCC/Mono的示例:。 – supercheetah 2010-04-09 09:33:02