gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:46:16 33 4
gpt4 key购买 nike

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

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

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

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

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

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

使用/CLR 开关 - 我理解这意味着添加对托管对象的支持。这种方法的缺点是什么?此选项是否支持上述事件?我们可以说,“这是托管库。将/clr 编译器选项与您的旧代码一起使用并使用它吗?”我不知道这件事的后果。是否有一个很好的例子来说明它是如何工作的? (肯定有,只是没找到)

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

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

  • DP
  • 最佳答案

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

    关于com - 从非托管 C++ 调用托管代码(c#)的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1889952/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com