无法在可移植类库fü;r.NET4.5、W8、WP8.1和SL5
我想为.NET 4.5、Windows 8、Windows Phone 8.1和Silverlight 5创建一个PCL,但是在检查所有这些平台时,我无法使用ICommand,尽管所有这些平台都应该支持它 复制步骤:无法在可移植类库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和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
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接口的命令绑定。欢迎反馈