从非托管C ++调用托管代码(c#)的最佳方法

时间:2009-12-11 18:23:48

标签: com interop unmanaged managed

我们开发了一个由C#开发的一组对象组成的s / w架构。他们广泛使用事件来通知客户状态的变化等。

最初的目的是允许遗留代码通过COM互操作服务使用这些托管对象。这很容易在设计规范中写出,但我发现实际实现它更成问题。我已经搜索了很多小时,希望使用这种方法查找一个很好的事件处理示例。在我们沿着这条路走下去之前,我想确保COM互操作是允许遗留代码调用我们的新代码的最佳方式。

看来有几种不同的选择:1)COM互操作,2)编写非托管包装类3)使用/ clr编译器开关启用托管对象调用,4)使用某种反向pInvoke调用。我错过了吗?

每个选项都有其优点和优点。缺点,我想知道最好的方法是什么。以下是每个

的具体问题/意见

COM INTEROP - 事件处理似乎是一个障碍。我们使用具有变量类型的事件作为参数。事件参数可以具有事件ID和对象。根据事件ID,该对象将属于某种类型。可以用COM互操作来处理吗?许多暴露的对象都具有属性。您不能在接口中声明属性,因此所有属性都需要相应的get / set方法。

WRITE UNMANAGED WRAPPER - 我认为这意味着使用/ clr选项创建DLL以允许创建和调用托管对象并公开非托管对象。这些客户端是否会受到管理。我以前没有这样做过。有什么好处/缺点?

使用/ CLR SWITCH - 我理解这意味着添加对托管对象的支持。这种方法的缺点是什么?此选项是否支持上述事件?我们可以说,“这是托管库。使用/ clr编译器选项和遗留代码一起使用吗?”我不知道这个的后果。有没有一个很好的样本如何解决这个问题? (我确定有,我还没找到)

使用反向PINVOKE - 我不确定这是如何工作的,但是,从我能够找到的,这不是一个可能有效的解决方案。

那么,决策树如何找到正确的方向呢?任何帮助表示赞赏。

  • DP

1 个答案:

答案 0 :(得分:1)

我认为您最初的解决方案是最好的解决方案。 COM互操作稳定且记录合理。您需要做的就是确保可能从给定事件处理程序弹出的所有不同事件对象实现相同的COM可见基本事件对象接口(具有事件类型id等)。从那里,单个对象可以实现他们想要的任何其他接口,并且您的非托管代码可以根据您要定义的任何条件为正确的“详细信息”界面进行QI。这真的不是那么难。查看this CodeProject文章,了解包含非托管事件处理程序的端到端示例。