6

在 Windows Phone 8 和 Windows 8 之间共享代码时,开发人员的两个核心选项是 1) Windows 运行时组件和 2) 门户类库。

Windows 运行时组件使用 WinRT,并且可以投影到所有受支持的语言中。在不同平台上使用时,它们需要单独项目(二进制文件)中的链接文件。但是,它们共享 90% 的可用 WinRT API。

可移植类库是 BCL 的一个子集(有时是重要子集),具有跨平台的二进制兼容性。它们可用于 WinRT 应用程序,也可用于 Silverlight、Xbox 等其他项目类型。

当开发人员选择“共享策略”时,哪种项目类型是在 Windows Phone 8 和 Windows 8 之间共享代码的最佳技术?谢谢。

4

4 回答 4

4

这取决于您需要什么形式的共享:

1) 如果您有一个通用的 C++ 业务逻辑层,您可以使用 Windows 运行时 (WinRT) 组件将其公开给 Windows Phone 和 Windows Store 应用程序(这是 Windows Phone 的唯一用例,因为您无法编写 WP8 应用程序使用 JavaScript 或使用 .NET 来创作 WinRT 组件)。

但是,您必须构建两个单独的 WinRT 组件,一个用于电话,一个用于 Windows 应用商店。应该可以使用预处理器指令 ( #if) 共享 WinRT 互操作层的 C++/CX 代码以标记平台特定代码。

2) C#/VB 中的业务逻辑仅依赖于可移植类库中可用的 .NET API。然后,您可以使用可移植类库 (PCL) 来包含该逻辑。基本上,如果您可以将库构建到 PCL DLL 中,那么这应该可以工作。然后,您可以在 Windows Phone 和 Windows Store 应用程序中以二进制形式引用此 PCL。

然而,正如 Martin 所说,在使用 3rd 方库时需要小心,因为这些库也需要为 PCL 构建。一些第三方库已经以 PCL 形式提供(例如 JSON.NET)。

3) 您希望共享具有 PCL 不支持的平台 API 依赖项(或 3rd 方库依赖项)的代码。然后您需要创建单独的 DLL 库,每个平台一个。您可以使用链接的 C#/VB 源文件来避免代码重复,并使用构建标志(#if再次)来允许在目标平台之间进行小的代码更改。

于 2012-11-27T14:03:52.257 回答
3

如果要在 Windows Phone 8 和 Windows 8 之间共享代码,则不能使用 Windows 运行时组件,因为 Windows 8 使用的组件不同,Windows Phone 8 使用的组件也不同,它们不可互换。
我会为一些简单的通用库选择可移植类库,或者通过链接和#if WP8 编译指令进行代码共享 - 这只是工作并且比可移植库更强大。
还要记住,大多数外部库(如 MVVM Light)不能在 Portable Libs 中引用,因此如果要使用它们,则必须通过文件引用使用代码共享。

于 2012-11-27T08:28:52.807 回答
1

有关如何有效使用可移植类库在平台之间共享代码的一些指导,请参阅此博客文章:如何使可移植类库为您工作

于 2012-12-06T18:07:29.460 回答
1

此问题不再与在支持共享项目的 Visual Studio 2013 Update 2 中引入 Windows Phone 8.1 通用应用程序相关。

等一下,就我而言,即使在 Visual Studio 2013 Update 4 中,这个问题仍然很重要,因为那里有两种类型的项目:

类库(通用应用程序的便携式)- PCL

Windows 运行时组件(通用应用程序的便携版)-WinMD

我只能看到它们之间的一大区别:WinMD 仅使用 WinRT,而 PCL 也可以与 .Net 和 Silverlight 一起使用。但我也想知道更多关于哪个以及何时更好地选择。

于 2015-03-24T15:25:27.853 回答