有没有办法在UWP应用程序和WPF应用程序之间共享代码?

时间:2016-01-21 00:48:14

标签: c# wpf mvvm uwp

要清楚,我遵循MVVM模式,我想构建我的项目,以便我可以在UWP应用程序和标准WPF应用程序之间共享我的模型代码。我要分享的代码没有UI。我不喜欢寻找新工具来取代我多年来一直使用的工具,这些工具可以处理日志记录,连接到面向文档的数据库等某些任务。

我试图围绕我已有的一些代码开始编写UWP包装器并直接引用模型项目。 Visual Studio拒绝让这种情况发生,向我显示一条错误消息“无法添加对项目'ACK.Model'的引用”。当我试图将模型放在通用库中并从WPF应用程序引用它时,同样的事情发生了。我不是想分享WPF代码。只是没有引用UI库的模型层。

这是一个可怕的命题,因为这意味着如果我想做任何实质性的事情,我必须选择100%跳到UWP或保持100%WPF。 NewtonSoft.JSON可能有一个通用发行版(ASP.NET MVC),但是ElasticSearch.NET和制作重要应用程序所需的其他工具呢?

我发现了“可移植类库”项目类型隐藏的位置。 PCL允许我在WPF和Universal应用程序之间共享我的代码,因为这是其中一个选项。这解决了我的代码的Model部分的简单情况,但我(仍然)不能使用我想要的一些库。我需要的大量库还没有PCL。

2 个答案:

答案 0 :(得分:14)

大约一年后,随着Visual Studio 2017的出现,有一个更完整的解决方案。如果您将库定位到 .Net Standard ,那么该库与 .Net Core 应用程序和单一的 .Net 目标应用程序兼容。对标准.Net库和API的支持相当完备,对现代C#语言功能的支持也是如此。

现在的一般建议是:

  • 目标 .Net标准适用于所有图书馆
  • 为您的实际应用定位适当的平台。 (UWP或WPF)。

注意:如果您的库必须与C库或应用程序交互,则必须格外小心以确保加载正确的版本。

似乎有一个解决方案,但它必须被您想要使用的整个工具链采用。当Microsoft在Windows 8中引入Windows应用商店应用时,他们还引入了可移植类库(PCL)。 PCL的目的是在应用程序的不同部分之间共享代码。

在Visual Studio 2015中创建PCL时,您可以指定要从中访问的API类型:

  • Universal Apps
  • .Net Core 5
  • .Net 4.6

当然,这限制了您可以使用的API,但只要不与UI相关,您想要使用的大多数都可以。还有其他限制:

  • 您的项目只能在Visual Studio 2015或更高版本中进行编辑
  • 您无法访问Environment变量(即用户文档目录等)中的特殊目录。
  • 您无法链接到仅为您的某个目标平台设计的库(即libgit2sharp等)
  • 无法浏览此子集的API - MSDN需要坚持下去。 MSDN已经更新了大部分API文档,但它已经#39 ; s仍然很难弄清楚什么适用于您的PCL

但是,您可以将为单个目标平台设计的任何库链接到PCL。它并不理想,但总比没有好。

ASP.NET MVC堆栈已移植到使用PCL,因此您可以直接使用NewtonSoft.JSON以及该应用程序使用的任何其他库。但是,有几个库尚未移植。

这种安排迫使您思考如何更好地整合。 .Net Core 5似乎很稳定,但支持处于初期阶段。从VS 2015更新1开始的当前一代Universal Apps直接使用.Net Core 5.

即使正在开展工作,Nuget仍有一些功能目前尚未得到支持:

  • MS Build扩展(对MSBuild和project.json结构的主要更改)
  • 安装/卸载脚本(与删除安装概念有关)
  • 内容(与安装/卸载相关,但工作正在进行中)
  • 内容转换(与缺少安装/卸载相关)

我希望我有更完整的答案。但是,就我发现PCL及其在当前基础设施方面的演变而言,这是我所得到的。

我正在创建一个游戏创建工具包,该工具包直接包含版本控制。我希望能够将游戏部署为Windows 10应用程序或标准WPF应用程序,但由于我用于集成版本控制的库,我需要将编辑器创建为标准WPF应用程序。我必须在构建共享代码和导入正确的库方面有点创造性。

首先,我的项目层次结构:

  • Project.Model(可移植类库)
  • Project.Model.Versioning(标准C#库)
  • Mvvm.Toolkit(可移植类库)
  • 编辑(标准WPF申请)

我希望核心PCL能够加载项目并反序列化JSON编码对象。 PCL确实可以访问System.IO,但令人惊讶的是它与标准C#库中定义的不同。以下是我必须解决的问题:

  • 将包引用添加到NewtonSoft.JSON后,我不得不更改packages.config文件中的目标框架:

    <package id="Newtonsoft.Json" version="8.0.2" targetFramework="portable-net452+win81" />

  • 依赖于我的Project.Model类的所有项目都必须安装`system.io.filesystem&#39;来自nuget的包,以便System.IO.FileInfo等对象是相同的。

虽然这绝对不是灵丹妙药,但它也不是死路一条。我确信还有更多陷阱,但这至少可以解决一些问题。

答案 1 :(得分:0)