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

时间:2012-11-26 21:48:54

标签: windows-8 windows-runtime windows-phone-8 portable-class-library

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

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

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

当开发者选择"共享策略"哪种项目类型是在Windows Phone 8和Windows 8之间实现最佳工作共享代码的首选技术?谢谢。

4 个答案:

答案 0 :(得分:4)

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

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

您必须构建两个单独的WinRT组件,一个用于Phone,另一个用于Windows Store。应该可以使用预处理程序指令(#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)以允许在目标平台之间进行小的代码更改。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

有关如何有效使用可移植类库在平台之间共享代码的一些指导,请参阅此博客文章:How to Make Portable Class Libraries Work for You

答案 3 :(得分:1)

  

此问题与Windows的引入不再相关   支持的Visual Studio 2013 Update 2中的Phone 8.1 Universal Apps   共享项目。

等一下,就像我在Visual Studio 2013 Update 4中一样,这个问题仍然具有相关性,因为那里有两种类型的项目:

类库(适用于通用应用的便携版) - PCL

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

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