【问题标题】:HOWTO: Call Managed C# Interface From Unmanaged C++ On WindowsCE Compact Framework如何:在 Windows Compact Framework 上从非托管 C++ 调用托管 C# 接口
【发布时间】:2010-10-25 13:18:24
【问题描述】:

我有大量非托管 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 是否以这种方式工作,但假设它确实如此。

  1. 我是不是找错树了?是否可以通过对应的COM接口在非托管C++中使用托管C#接口?

  2. 在其 AssemblyInfo.cs 文件中设置 [assembly: ComVisible(true)] 属性是否可以通过 AssemblyInfo.cs 定义的 GUID 在非托管世界中通过 COM 使用托管程序集中的所有接口,还是我需要做更多的事情吗?

  3. 如何从托管 .dll 中取出 typelib,以便我的非托管 C++ 库可以#import 它?

  4. 我尝试将我的托管 C# 库项目添加为非托管 C++ 库项目中的引用,但这似乎没有帮助。在这种情况下,这样的参考是否相关?

  5. 是否有更好的方法来解决从非托管 C++ 世界调用托管 C# 代码的基本问题?我刚刚在这里读到的内容是一个混合模式库,它带有一个托管翻译层,以弥合非托管/托管差距。我不确定这是一个好的策略,因为呼叫响应速度是一个重要因素,但从长远来看可能会更好,因为我计划在某个时候将 UI 重写为托管 C#,从而将所有的努力都放在抛弃 UI 而不是使用更永久的业务/通信逻辑?不管这个问题的答案如何,我仍然想解决使用 COM 的问题,如果只是出于好奇。

【问题讨论】:

    标签: com compact-framework windows-ce unmanaged managed


    【解决方案1】:

    我尝试在 WinCE 中从 C++ 调用 C#。我不相信 Compact Framework 提供任何 COM 支持,因此您不能使用 ComVisible(true)。

    我也找不到在 C++ 中托管 .NET 的方法,因为该功能没有在 Compact Framework 中公开。

    我的解决方案是创建一个存根 C# 应用程序并通过 Msg Queues 与 C++ 主机通信。这也解决了数据封送问题。我的使用性能很好。最大的成本是存根的启动时间,如果你是完整的应用程序,无论如何你都必须支付 C#。

    【讨论】:

    • 这似乎是一个很好的方法。如果本机代码在 dll 中,我什至认为您不需要消息队列。 C# 代码可以直接调用函数,您可以将 C# 中的委托/函数指针传递到本机 dll 中,以提供一种在需要时调用 C# 的方式。
    【解决方案2】:

    你找错树了。为了让本机代码调用托管代码,本机代码必须启动 CLR 的执行引擎。这称为CLR Hosting,CF 不支持它。这意味着你根本做不到——即使是创造性的黑客也做不到(相信我,我已经尝试过每条小巷)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 2013-01-07
      • 2011-03-04
      相关资源
      最近更新 更多