0

我有一个遗留应用程序,它使用基于 COM 的非托管 C++ (MFC/ATL) 来提供一个 API,该 API 在历史上一直被 Visual Basic 脚本(偶尔是 C++ dll)用来为主应用程序提供自定义对象和脚本扩展. 最近,我们面临着允许用户在 C# 中创建加载项并通过 dll 加载它们的压力。这些加载项中的功能范围包括一些内部计算以及将回调函数附加到主应用程序触发的 COM 事件。

我知道创建可以从非托管 c++ 中使用的 C# 插件的最简单(并且可能更合乎逻辑)的方法是使用 COM 互操作,但我们不希望最终用户编写插件 - ins 必须管理 COM 代码等。由于加载项不会创建任何新的 COM 类,而只是使用主应用程序提供的类,所以我想找到一个使 C# 模块尽可能简单的解决方案。为此,我正在考虑一个位于非托管应用程序和 C# 插件之间的 C++/CLI 包装器。

(1) 根据我的要求,这是否必要?有没有更简单的方法来加载仅订阅非托管代码中的 COM 事件的 ac# dll?

(2) C++/CLI 包装器听起来像是为最终用户提供最简单解决方案的最佳方式吗?

任何帮助或解释将不胜感激......我目前正在研究 .Net 和 Com:完整的互操作性指南,但一次需要接受很多。另外,我知道这个问题引用了许多其他问题中的重复信息,但我找不到任何以前处理过这个特定最终用户问题的问题。

更新:我可能应该指定我们在主应用程序二进制文件中导出类型库,并且我已经有能力创建一个可以实例化 .net 对象并附加到 COM 事件的 C# 可执行文件。我需要了解的是如何使用类库(dll)做同样的事情。对于 C++ dll,我们调用 LoadLibrary 并在 DLL 中提供一个入口点,该入口点执行所有静态初始化,但我不知道如何使用 C# 执行此操作,我的理解是,除非非托管应用程序使用 CLR 引导 CLR,否则这是不可能的前面提到的方法之一。希望我只是被误导了,这比我想象的要容易得多?

4

1 回答 1

1

解决方案实际上将取决于交互的方向。

对于消费事件,您可能可以创建一个 C# 项目,该项目通过 RCW 与您的非托管组件进行通信,并简化了连接事件的过程。但是,如果您需要能够让非托管组件调用 3rd-party 组件函数,这将变得更加复杂。在这种情况下,您可能需要修改非托管组件以调用托管模块(同样,通过 COM 互操作),但需要构建这些组件以通过 COM 互操作导出接口。

不过,COM 互操作有很多“陷阱”。作为建议,考虑将托管互操作组件放入 COM+ 应用程序中,这样它们就可以在进程外运行;这并非没有额外的复杂性,但它可以帮助防止 .NET 版本控制、32/64 位问题、进程状态等的各种问题。

最后,我没有看到使用 C++/CLI(通过 C#)的任何特殊理由,除非您更熟悉它。一旦您将 COM 互操作作为通信机制,托管组件的语言就无关紧要了。

希望对您有所帮助……这是一个复杂的技术领域,因此需要一些工作(我已经做过几次了)。

于 2013-07-23T22:52:09.727 回答