我有大量非托管 Windows CE 5 C++ 代码,通过将它与在 Windows CE 6 和 Compact Framework 上用托管 C# 编写的大量更新的业务和通信逻辑相结合,提供了一个我想在新产品中使用的 UI。
UI 可能知道业务逻辑,但我希望业务逻辑不了解 UI,以便我以后可以用托管版本或我选择作为前端的任何其他 UI 替换它。
我找到了一篇文章,描述了如何在 Windows 世界中使用 COM 作为桥梁,但在 WinCE 下的 .NET CF 中应用它时遇到了困难。过去我导入类型库,使用COM调用(CoInitialize()、CoCreateInstance())来获取其他Windows平台上的接口指针,这就是我现在追求的策略:直接在非托管 C++ 库来访问我的托管库中的 C# 接口,假设 WinCE 中提供了相同的工具。
这是我的问题:类型库。它在我的托管 C# 库中不可用,因为我过去通过 '#import "SomeCPPLibrary.dll"' 语句使用它。我相信它隐藏在 .dll 程序集中,以与过去不同的方式存储,因此不能通过库本身的#import 直接使用。我认为我可以#import 一个 typelib,但是我找不到从我的托管 .dll 中提取 typelib 的方法,虽然我可以将一个接口定义文件 (.idl) 组合在一起并使用平台的 midl.exe要从中生成 .tlb,不能保证我的 .idl 以及由此产生的 .tlb 会真正匹配我的 C# .dll 中的内容。我什至不知道平台 midl.exe 是否以这种方式工作,但假设它确实如此。
我在吠叫错误的树吗?是否可以通过相应的 COM 接口在非托管 C++ 中使用托管 C# 接口?
在其 AssemblyInfo.cs 文件中设置 [assembly: ComVisible(true)] 属性是否可以通过 AssemblyInfo.cs 定义的 GUID 在非托管世界中通过 COM 使用托管程序集中的所有接口,还是我必须做更多的事情?
如何从托管的 .dll 中获取类型库,以便我的非托管 C++ 库可以#import 它?
我尝试将我的托管 C# 库项目作为参考添加到非托管 C++ 库项目中,但这似乎没有帮助。在这种情况下,这样的参考是否相关?
有没有更好的方法来解决从非托管 C++ 世界调用托管 C# 代码的基本问题?我刚刚在这里读到的内容是一个混合模式库,它带有一个托管翻译层,以弥合非托管/托管差距。我不确定这是一个好的策略,因为呼叫响应速度是一个重要因素,但从长远来看可能会更好,因为我计划在某个时候将 UI 重写为托管 C#,从而将所有的努力都放在抛弃 UI 而不是使用更永久的业务/通信逻辑?不管这个问题的答案如何,我仍然想解决使用 COM 的问题,如果只是出于好奇。