我有一个遗留应用程序,它使用基于 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,否则这是不可能的前面提到的方法之一。希望我只是被误导了,这比我想象的要容易得多?