C++/CX 能否简化我的(非 WinRT)WPF 应用程序?

Posted

技术标签:

【中文标题】C++/CX 能否简化我的(非 WinRT)WPF 应用程序?【英文标题】:Can C++/CX simplify my (non-WinRT) WPF application? 【发布时间】:2011-11-20 02:42:41 【问题描述】:

C++/CX 似乎使原生 C++ 与 C# FAR 的接口比当前使用 C++/CLI“层”中间的方法更容易和更直接(伴随着所有复杂性)。 但是我可以在老式 WPF 桌面样式应用程序中使用 C++/CX OUTSIDE WinRT 吗? 澄清:我的 WPF 应用程序“包装”了旧的 Windows32 应用程序代码。所以我正在与原生 c++ 交互,但是在同一个应用程序中使用原生 c++、托管 C++ 和 c# 很尴尬..

【问题讨论】:

C++/CX 生成纯本机代码,与 C++/CLI 不同。一些互操作是可能的,因为 C++/CX ref 类在底层是 COM。不过,注册会很棘手,WinRT 使用非常不同的部署方案(所有内容都在 .zip 中)。你将不得不以某种方式注册它。 C++/CX 肯定不会生成 DllRegisterServer 方法以便 Regsvr32.exe 可以工作。 啊,好吧,所以 C++/CX 就像 COM,但不完全一样。 c# 应用程序(WinRT 之外)不能轻易引用它。 理论上(因为它是底层的 COM)可以通过 COM-Callable-Wrapper 在 .NET 中访问它们…… 【参考方案1】:

不,您不能在 WinRT 之外使用 C++/CX - 它依赖于 Windows 运行时元数据,并且没有非 winrt API 的元数据。

【讨论】:

我认为他是在谈论用 C++/CX 编写自己的 WinRT 组件,然后从 .NET WPF 应用程序中引用该组件。除非 WinRT 投影仅对 Metro 风格的应用程序启用,并且在桌面 .NET 中不可用,否则在我看来这应该确实有效。 Pavel:你说得对,应该可以。我以为他是在尝试使用 C++/CX 来简化其他 COM 操作。 在 Metro 风格应用程序领域之外安装和激活 WinRT 对象将很困难。没有安装包。 谢谢帕维尔 - 真是太糟糕了。 C++/CLI 是桌面的互操作故事,而 C++/CLI 在 Metro 风格的应用程序上是死的,而 C++/CX 是 Metro 的互操作故事,并且不允许在桌面上使用。来吧 MS...给我们跨平台 C++/CX 的好处! 对不起,我以为这是关于 C++/CX 中的 C++/CX 的。是的,CLR 查看非第一方应用程序的包标识。我确实说过它不起作用。如果它确实有效,那将是一个我们必须修复的错误。【参考方案2】:

是的,你可以。 WinRT 和 Win32 是可互操作的,只是任何使用 WinRT 世界之外的任何东西的应用程序都不能在应用商店中出售。

【讨论】:

以上是关于C++/CX 能否简化我的(非 WinRT)WPF 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

在 .cpp 文件中声明具有实现的 C++/CX WinRT 属性的语法是啥?

相当于C ++ / WinRT中的Platform :: IBoxArray

如何在“native c ++”环境中使用WinRT IAsyncOperation *对象

从本地C ++代码调用C ++ CX

使用 Windows 10、WinRT 拍照

将 WRL 用于 C++/CX 函数 - 链接器错误 [重复]