HOW TO:在Windows CE Compact Framework上从非托管C ++调用托管C#接口

时间:2009-05-12 12:49:51

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

我有广泛的非托管Windows CE 5 C ++代码,它通过将它与在Windows CE 6和Compact Framework上使用托管C#编写的大量新的业务和通信逻辑相结合,提供了我想在新产品中使用的UI

UI可能知道业务逻辑,但我希望业务逻辑不知道UI,以便我以后可以用托管版本或我选择作为前端的任何其他UI替换它。

我发现了一篇文章,描述了如何使用COM作为Windows世界中的桥梁,但我在WinCE下的.NET CF中应用它时遇到了困难。在过去,我已经导入了类型库并使用COM调用(CoInitialize(),CoCreateInstance())来获取指向其他Windows平台上的接口的指针,这就是我目前正在追求的策略:直接使用COM假设WinCE中提供了相同的工具,非托管C ++库可以访问托管库中的C#接口。

这是我的问题:typelib。它在我的托管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#,从而将所有努力都放在扔掉用户界面而不是用更永久的商业/通信逻辑来捣乱?无论这个问题的答案如何,我仍然希望解决使用COM的问题,如果没有其他原因而不是好奇心。

2 个答案:

答案 0 :(得分:3)

我试图在WinCE中从C ++调用C#。我不相信Compact Framework提供任何COM支持,所以你不能使用ComVisible(true)。

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

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

答案 1 :(得分:2)

你正在咆哮错误的树。为了使本机代码调用托管代码,本机代码必须启动CLR的执行引擎。这称为CLR Hosting,CF不支持。这意味着你根本做不到 - 甚至没有创造性的黑客攻击(相信我,我一直在努力尝试)。