选择Windows运行时组件与可移植代码库



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

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

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

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

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

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

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

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

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

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

如果你想在Windows Phone 8和Windows 8之间共享代码,那么你不能使用Windows运行时组件,因为Windows 8和Windows Phone 8使用的组件不同,它们不可互换
对于一些简单的泛型库,我会选择可移植类库,或者通过链接和#ifWP8编译指令进行代码共享——这只是有效的,而且比可移植库更强大
还要记住,像MVVM Light这样的大多数外部库不能在Portable Lib中引用,所以如果你想使用它们,你必须通过文件引用使用代码共享。

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

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

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

类库(通用应用程序可移植)-PCL

Windows运行时组件(可移植用于通用应用程序)-WinMD

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

最新更新