微软最近为其新的 Phone 7 平台发布了工具和文档,令那些拥有大量 C++ 代码库的人(如我)不再支持原生开发感到沮丧。尽管我发现有人猜测这个决定会被推翻,但我对此表示怀疑。所以我在想,通过调整它以在 C++/CLI 下编译,让这个代码库可用于 Phone 7 是多么可行。当然,用户界面部分无法移植,但我不确定其余部分。有人有类似的经历吗?我不是在谈论执行繁重的低级工作的代码 - 但是模板和智能指针的使用非常频繁。
6 回答
c++/cli 理论上可以与 WPF/Silverlight 一起使用,使用的技巧是将 XAML 生成的 C# 替换为可以在代码隐藏文件中的主类内部使用的宏定义。我制定了这项技术,但没有动力将其超越理论——我很高兴混合语言。
至于在纯安全模式下为您的逻辑代码使用 c++/cli,这可能仍然是不可能的,但我很想听听有人现在如何尝试它。在 2008 年为 Silverlight 研究它时,我发现了这个令人生畏的silverlight 论坛评论:
我刚刚通过将我的 C++ 项目中的 MSIL 编译成与 Silverlight 兼容的 DLL 来尝试使用 Silverlight&C++。好消息:它有效,您可以从 Silverlight 项目中调用此代码。坏消息:C++ 编译器显然使用了 Silverlight 不允许的 MSIL 指令。
所以,如果你尝试这个,即使是最简单的程序,你几乎会立即得到异常“操作可能会破坏运行时的稳定性”。对我来说,这使得我们很快就会看到 Silverlight for C++ 的可能性似乎不大,因为编译器的行为需要完全不同。
您可以使用 /clr:safe 选项在 C++/CLI 中生成可验证的托管代码。问题是您的大多数普通 c++ 代码都无法使用该选项进行编译。
C# 目前是 WinPhone7 唯一支持的语言。
我完全期望 MS 将来也会增加对 VB 和 C++/CLI 的支持,但不要指望很快就会开放原生代码和服。
原生代码有太多问题需要克服,特别是在安全性、可靠性等方面。托管代码更容易静态验证,更容易在运行时控制。
如果您对将 C++ 代码移植到 C# 感到不安,请庆幸 MS 没有强迫您必须迁移到 Objective-C ;)
根据我们自己的经验,将编写良好的 C++ 移植到 C# 的过程实际上比最初预期的要少得多。当然,有一个学习曲线,但你有任何端口。实际上,我们从将核心应用程序和数据引擎移植到 C# 中获得了很多好处,以至于我们重新调整了整个团队以使用 C# 编写代码,并在必要时将 C# 移植回 C++,而不是反过来!到目前为止,我们只将两个模块移植回 C++ 并通过互操作从我们的本机代码调用我们的 C# 代码。
同样,请记住,WinPhone 是一个全新的平台,它使用同类最佳、高产的下一代开发工具和平台。这不是你父亲的 WinMo。
如果对 C++ 的支持是您认为至关重要的事情,那么请确保 MS 知道——(恭敬地和专业地)在 MSDN 论坛和您附近的开发人员活动中表明您的立场。
更新1:2012-12-17:
虽然 Windows Phone 7 仍未正式支持原生 C++,但 Windows Phone 8 现在支持原生 C++ 代码,因此您可以更轻松地将现有 C++ 代码库移植到 Windows Phone 8(以及 Windows 8 和 Windows 桌面应用程序) .
虽然目前 Windows8/Phone8 平台和 API 之间还没有 100% 的兼容性,但我预计这两个平台在接下来的几个版本中会变得越来越集成。
现在尤其如此,因为 Windows 与微软其他团队之间更紧密合作的主要障碍之一最近离开了公司;)
更新 2:2014 年 4 月 15 日:
根据最近在 //BUILD/ 2014 上发布的公告,您现在可以开始使用 C++ 和 XAML、C#/VB 和 XAML 或 JavaScript 和 HTML 构建“通用”应用程序,这些应用程序将在 Windows 8.1、Windows Phone 8.1 和 Xbox One 上运行!有关构建 Windows Phone 8.1 通用应用程序的更多详细信息,请阅读本文。
整个开发理念建立在 Silverlight 之上。我认为您可以毫无问题地将用 C++ 编写的托管 dll 添加到此 Silverlight 项目,但它不能使用本机代码。
我计划今晚在我的机器上安装这些工具,并尝试一下。
如果 MS 决定离开这条路并创造新的东西,那很好,这是 MS 的决定。所以让我们面对事实。Silverlight 还没有成功。由于 Apple、Android 和 RIM,MS 失去了重要份额。应用程序开发人员只需评估他们自己的应用程序的商业案例,并决定他们是否相信 Windows 7 手机的份额收益。对于我经营的公司,我们决定不再支持 MS Windows phone 7,不是因为这个或其他技术原因,而是因为我们不相信我们对端口的投资回报。如果我们看到这个新平台的市场成功,我们将来会开始支持 Apple、Symbian、Andoid 和 MeeGo。所有这些都支持 C/C++ 并使我们能够重用我们经过验证的应用程序内核。那么为什么要担心呢。个人技术偏好不应受到限制。
托马斯
它终于在地平线上!
因此,发送给 Windows Phone 开发人员的关于他们未来的开发偏好和 XNA 的调查在调查中没有提到一次(发送给 Windows Phone 开发人员的调查 - 我提到过吗)
然而,他们确实会问:
您希望如何在您的移动应用程序/游戏中使用 C++?
- 从上到下开发 C++ 应用程序/游戏(UI、业务逻辑和平台 API)
- 用C++做业务逻辑,然后写平台抽象层
- 使用 C++ 进行业务逻辑使用 3rd 方运行时引擎
- 我不想使用 C++