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

Com 从非托管c+;调用托管代码(c#)的最佳方法+;,com,interop,unmanaged,managed,Com,Interop,Unmanaged,Managed,我们开发了一个s/w体系结构,它由一组用C#开发的对象组成。他们广泛使用事件来通知客户状态的变化等 最初的意图是允许遗留代码通过COM互操作服务使用这些托管对象。这在设计规范中很容易写,但我发现实际实现它的问题更大。我已经搜索了很多小时,寻找使用此方法的事件处理的良好示例。在我们沿着这条道路前进之前,我想确保COM互操作是允许遗留代码调用新代码的最佳方式 似乎有几个不同的选项:1)COM互操作,2)编写非托管包装类3)使用/clr编译器开关启用托管对象的调用,4)使用某种反向pInvoke调用。

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

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

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

每种选择都有其优缺点,我想知道最好的方法是什么。以下是针对每个问题的具体问题/评论

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

编写非托管包装器-我假设这意味着使用/clr选项创建DLL,以允许创建和调用托管对象并公开非托管对象。将这些非托管的客户端。我以前没做过。这有什么好处/缺点

使用/CLR开关-我理解这意味着添加对托管对象的支持。这种方法的缺点是什么?此选项是否支持上述事件?我们是否可以说,“这是托管库。将/clr编译器选项用于遗留代码,并对其进行测试?”我不知道这会产生什么后果。是否有一个很好的例子来说明这一点?(我肯定有,只是还没找到)

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

那么,要找到正确的方向,决策树是什么样子的呢?感谢您的帮助

  • DP

    • 我认为您最初的解决方案是最好的。COM互操作是稳定的,并且有合理的文档记录。您需要做的就是确保可能从给定事件处理程序中弹出的所有不同事件对象实现相同的COM visible基本事件对象接口(具有事件类型id等)。从那里,单个对象可以实现他们想要的任何其他接口,并且您的非托管代码可以基于您想要定义的任何标准来寻找正确的“细节”接口。其实没那么难。查看CodeProject文章,了解包括非托管事件处理程序在内的端到端示例。

      还可以选择通过CoreRT将C代码编译为本机代码并直接调用它。