Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在可移植类库fü;r.NET4.5、W8、WP8.1和SL5_.net_Silverlight_Windows Phone 8_Portable Class Library - Fatal编程技术网

无法在可移植类库fü;r.NET4.5、W8、WP8.1和SL5

无法在可移植类库fü;r.NET4.5、W8、WP8.1和SL5,.net,silverlight,windows-phone-8,portable-class-library,.net,Silverlight,Windows Phone 8,Portable Class Library,我想为.NET 4.5、Windows 8、Windows Phone 8.1和Silverlight 5创建一个PCL,但是在检查所有这些平台时,我无法使用ICommand,尽管所有这些平台都应该支持它 复制步骤: 使用.NET 4.5、Windows 8和Silverlight 5创建PCL项目 创建一个实现ICommand的类并生成成员 构建成功 在项目设置中添加Windows Phone 8.1 生成失败(找不到System.Windows) 如果您删除Silverlight或WP,则

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

复制步骤:

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

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

  • 生成失败(找不到System.Windows)
  • 如果您删除Silverlight或WP,则它可以工作,但如果两者同时处于活动状态,则不会工作

这是臭虫吗?还是我遗漏了什么?

不幸的是,我们无法在针对Silverlight 5和Windows Phone 8.1的PCL中支持ICommand(以及其他ViewModel类型,如ObservableCollection)。我建议放弃PCL对SL5的支持,并通过一个不可移植的库来支持该平台。

我认为您可以在这里完成的最佳解决方案是创建一个共享项目,并将所有代码放入其中(VS2013.2+必需),然后为除SL5之外的所有内容创建一个PCL(概要文件259),然后创建一个SL5类库(两者都具有对共享项目的共享引用)。这将使您能够以所有平台为目标(但遗憾的是,需要两个空程序集来支持通用平台)


@Danielp列出了MS是否会将非常通用的类型(如ICommand)重构为不太特定于平台的程序集/名称空间的任何输入?(很抱歉,但您似乎有内部知识).

当这个问题提了一年后,我遇到了一篇帮助解决这个问题的博文:--这个博文也包含了一个下载示例,所以你可以检查它的内部工作。这个博文使用
IBehavior
界面,但概念是一样的


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

假设您的PCL将被称为“AwesomeMvvm”。您需要:

  • AwesomeMvvm(可移植类库)
  • 银光
  • AwesomeMvvm.Windows81
当您尝试在可移植类库(PCL)中使用
ICommand
接口时,会出现一个错误,说明
无法解析符号ICommand
。要解决此问题,只需创建一个接口,确保它位于相同的命名空间
System.Windows.Input
。您的可移植类库现在可以编译了

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

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

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

看看这里……我是这样做的,但这是一个稍微不同的问题,不幸的是,解决方案不适用于这里。我们可能会发现如果你花一点时间解释为什么你不能支持PCL,那么你就可以少问很多关于PCL的问题。所以这不是一个论坛。@HansPassant我们不能支持它的原因是关于PCL如何实现的技术细节,大多数开发人员不需要知道或关心这些细节。问题是这些类型都在系统中Silverlight上的.Windows.dll,但该dll在Windows Phone上具有Windows Phone Silverlight UI堆栈,该堆栈被阻止加载到Windows Phone XAML应用程序中(因为它们具有不同的UI堆栈)。@DanielPlaisted:我知道这个答案已经有一年了,但OP不能利用“NuGet诱饵和开关”吗技术?事实上,在2014年5月写的一篇博客中,你特别就如何实现这一点发表了评论!我对此进行了更多的思考,因为我真的不太喜欢这个解决方案。我将我的工作放在这里:基本上,我的想法是创建一个通用的便携式指挥库(配置文件344)这不提供System.Windows.Input.ICommand支持,而是提供了ICommand的镜像兼容性副本。然后在共享项目(引用所有启用WPF的平台)中另外提供了一个子类按钮控件,该控件支持到可移植ICommand接口的命令绑定。欢迎反馈