不能在.NET 4.5,W8,WP8.1和SL5的可移植类库中使用ICommand

时间:2014-05-06 06:15:42

标签: .net silverlight windows-phone-8 portable-class-library

我想为.NET 4.5,Windows 8,Windows Phone 8.1和Silverlight 5创建一个PCL,但是在检查所有这些平台时我无法使用ICommand,尽管所有这些平台都应该根据{{{{{{ 3}}

重现的步骤:

  • 使用.NET 4.5,Windows 8和Silverlight 5创建PCL项目
  • 创建一个实现ICommand并生成成员的类
  • 构建成功

  • 在项目设置中添加Windows Phone 8.1

  • 构建失败(找不到System.Windows)
  • 如果您删除Silverlight或WP它可以正常工作,但同时它们都处于活动状态,但它不会。

这是错误吗?或者我错过了什么?

3 个答案:

答案 0 :(得分:1)

不幸的是,我们无法在针对Silverlight 5和Windows Phone 8.1的PCL中支持ICommand(以及其他ViewModel类型,如ObservableCollection)。我建议从PCL中删除SL5支持并通过非便携式库支持该平台。

答案 1 :(得分:0)

我相信你可以在这里完成的最佳解决方案是创建一个共享项目并将所有代码放入其中(需要VS2013.2 +),然后为除SL5之外的所有内容创建PCL(配置文件259),然后创建一个SL5类库(两者都具有对共享项目的共享引用)。这将使您能够定位所有平台(但不幸的是,需要两个空组件以支持通用平台)。

@DanielPlaisted关于MS是否会将非常类型(如ICommand)重构为较少特定于平台的程序集/命名空间的任何输入? (很抱歉,但你似乎有内部知识)。

答案 2 :(得分:0)

虽然这个问题已经有一年了,但我还是发了一篇博文来帮助解决这个问题:http://dotnetbyexample.blogspot.com/2014/05/writing-behaviors-in-pcl-for-windows.html - 这个博客也包含了一个下载示例,因此您可以检查其内部工作原理。该博客使用IBehavior界面,但是conept是相同的。

基本上,这种技术被称为" NuGet诱饵和开关" ;您需要创建一个包含PCL库和特定于平台的库(每个平台一个)的NuGet包。

让我们想象一下你的PCL将会被称为#34; AwesomeMvvm"。你需要:

  • AwesomeMvvm(可移植类库)
  • AwesomeMvvm.Silverlight
  • AwesomeMvvm.Windows81
  • ...

当您尝试在便携式类库(PCL)中使用ICommand接口时,您将收到一条错误消息,指出 Cannot resolve symbol ICommand 。要解决此问题,只需创建一个接口,确保它位于同一名称空间System.Windows.Input中。您的可移植类库现在可以编译了!

现在您的可移植类库已编译,创建特定于平台的库并向其添加对可移植类库的引用。这些库中的每一个只需要一个包含TypeForwardedToAttribute作为汇编级属性的代码文件:

[assembly: System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.Windows.Input.ICommand))]

最后一步是创建一个包含可移植类库的NuGet包,以及每个特定于平台的库。如果您正确地完成了所有操作,请添加NuGet Feed中的引用,一切都应该正常工作。 NuGet会尽可能地选择特定于平台的库,每个库都依赖于可移植类库。诀窍是在运行时它将使用ICommand的本机版本,因为您指定转发您的可移植类库版本以转发到特定于平台的版本。