使用ISO C ++回调注册委托函数(在单声道上)

时间:2010-04-08 20:31:39

标签: c# c++ vb.net mono delegates

我将一些ISO C ++数据类型暴露给.Net(确切地说是Linux上的单声道)。

为了简洁起见,我将在我的问题中引用C#,尽管我的问题涉及所有.Net语言(C#和VB.Net是我的目标语言)。

到目前为止,我已经研究了如何在C#类中公开ISO C ++数据类型以便在单声道中使用 - 感谢SO上的一些聪明人。

到目前为止唯一的问题是如何处理C ++回调。在.Net语言(C#和Vb.Net)中,我认为'委托'是回调等价物。

现在坚持使用C#,任何人都可以推荐一种方法,我可以用我的ISO C ++代码注册C#委托函数。

ISO C ++代码是一个通知库,我希望能够将通知“推送”到单声道框架(在这种情况下是C#代理)。

我的基本假设是,对于.Net语言实现这一点的机制/步骤是相同的​​ - 我只需要用.Net语言编写实际代表 - 这个假设是正确的吗?

最后但并非最不重要的是线程安全的问题。我公开的.Net(单声道更具体)的基础ISO C ++代码既重新进入也是线程安全 - 我是否必须做任何“额外”来从我的ISO C ++代码调用.Net委托?< / p>

1 个答案:

答案 0 :(得分:1)

确保您在C ++中定义和使用的函数指针具有C链接。 然后,您可以导出一个以函数指针作为参数的C函数,并且您将使用委托作为C#中的参数来调用它。

从C ++方面,你只需要正常调用函数指针。

请注意,只要可以调用C回调,就必须保持委托对象处于活动状态,如果要存储C回调以便稍后执行,则可能将委托存储在静态var或类似内容中时间比登记。

至于其余部分,您无法安全地从信号处理程序中调用托管代码:除此之外,只要您的托管代码是可重入且线程安全的,那么将是delgate / callback组合。