如何组织一个同时面向 UWP/WPF/.Net Core 控制台的 C# 项目解决方案

如何组织一个同时面向 UWP/WPF/.Net Core 控制台的 C# 项目解决方案

2017-10-21 03:20

希望写一个小型工具,给自己和需要的人。考虑到代码尽可能的复用,我准备采用 .Net Standard 来编写大多数核心代码,并基于 .Net Core 编写跨平台控制台入口,用 WPF 编写桌面端 UI 入口,用 UWP 作为可上架商店的 UI 入口,然后用 Shared Project 共享 WPF 和 UI 的多数 UI 入口代码。

阅读本文将了解到如何在尽可能复用代码的情况下组织这样的 C# 解决方案。


工具型项目,选择了控制台

用 WPF 开发桌面 UI,因为其有强大的 .NET Framework 库在背后支持,外加方便而功能齐全的 XAML 开发环境,在用 C# 进行桌面应用程序开发的时候不失为一种优秀的选择。但微软却并不怎么重视 WPF,而一直投入较大资源在半死不活的 UWP 上,导致 WPF 现在有非常多的坑是在 UWP 上才解的。然而,微软却并没有好好运营 UWP,以至于其开发者急剧减少,再在上面投入太多精力投入产出比显得太低。

.NET Framework 是个优秀的框架,可是与 Windows 桌面端绑得太死,以至于在当下多平台发展得都不错的情况下失去了大多数的竞争力。但是 .NET Core 解决了这个问题。然而谈到 UI 的跨平台,就是一个巨大的投入和难以见底的坑,以至于基于 .NET Core 且跨平台的 UI 框架目前依然没有出现。

毕竟只是工具型项目,并不想去动用大型 UI 框架 Xamarin/Unity,以至于写一个 .NET Core 控制台程序成了小型工具型项目的最佳解决方案了。

工具型项目是任务导向的,能完成任务为最终目的。控制台与配置文件的配合不仅足以完成任务,还为自动化或其他工具集成提供了方便。这里提供 UI 只是为了方便此工具用户的初学使用和理解。

组织一个 C# 解决方案

我们总共涉及到的 Visual Studio 项目类型有这五个:

  • 类库(.NET Standard)
  • 共享项目
  • 控制台应用(.NET Core)
  • WPF 应用(.NET Framework)
  • 空白应用(通用 Windows)

.NET Standard 和共享项目是默认就装上的,但其他三个却不是。需要在 Visual Studio 安装界面中额外勾选:

  • 用于安装通用 Windows 项目,如果你对此不感兴趣,忽略即可
  • 用于安装 WPF 应用,如果你对此不感兴趣,忽略即可
  • 用于安装 .NET Core 项目,这是跨平台的重点,建议安装

在 Visual Studio 中创建一个解决方案的时候依次添加这五种项目。

  • 我们的主要逻辑代码全在 .NET Standard 项目中。这里包含了完整的功能实现,可以脱离其他四种实现完整功能。
  • .NET Core 控制台项目仅仅作为入口,引用 .NET Standard 的项目,将用户输入的命令转为具体的函数调用。
  • 共享项目的代码主要是 UI 或 UI 辅助代码,例如控制 UI 的逻辑和 ViewModel。
  • UWP 和 WPF 项目仅包含 UI(XAML)和必要的不一致的 UI 控制逻辑,通过链接的方式将共享项目中的代码引入如何链接?
  • 其他的工具库当然也是需要的,但为了通用,建议优先选择 .NET Standard 的库。

这样,项目在 Visual Studio 中看起来大概是这样的:

本文会经常更新,请阅读原文: https://walterlv.com/post/organize-csharp-project-targeting-multiple-platforms.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Visual Studio Code 代理设置

Visual Studio Code (简称 VS Code)是由微软研发的一款免费、开源的跨平台文本(代码)编辑器,在十多年的编程经历中,我使用过非常多的的代...

3.9K70
来自专栏IT派

微软拥抱Python:Anaconda现已包含Visual Studio Code

IT派 - {技术青年圈} 持续关注互联网、区块链、人工智能领域 微软近日在官方博客宣布,已与与Anaconda达成合作,微软免费和跨平台代码编辑器 Vis...

42350
来自专栏机器学习算法与Python学习

这些好用的Python IDE!你用的哪一款?

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 “工欲善其事,必先利其器”,如果说编...

54590
来自专栏海天一树

Python实现聊天机器人

AIML全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由R...

24230
来自专栏华章科技

关于.NET玩爬虫这些事

从搜索引擎开始,爬虫应该就出现了,爬的对象当然也就是网页URL,在很长一段时间内,爬虫所做的事情就是分析URL、下载WebServer返回的HTML、分析HTM...

22630
来自专栏walterlv - 吕毅的博客

LTS(Long-term Support)是怎样的一种支持方式

2018-07-04 13:29

42810
来自专栏张善友的专栏

推荐一个在Linux/Unix上架设ASP.NET的 WEB服务器--Jexus

在Linux/Unix上架设ASP.NET WEB服务器,有两个可选方式,一种是Mono+XSP,一种是Mono+Jexus,其它的方式,比如 Apache+m...

47050
来自专栏张善友的专栏

来腾讯云开发者实验室 学习.NET Core 2.0

腾讯云开发者实验室为开发者提供了一个零门槛的在线实验平台,开发者实验室提供的能力: 零门槛扫码即可免费领取实验机器,支持使用自有机器参与,实验完成后支持保留实验...

306100
来自专栏张善友的专栏

Mono产品生命周期

  软件生命周期 同任何事物一样,一个软件产品或软件系统也要经历孕育、诞生、成长、成熟、衰亡等阶段,一般称为软件生命周期(软件生存周期) 。软件生命周期模型是指...

20650
来自专栏张善友的专栏

来腾讯云开发者实验室 学习.NET Core 2.0

27350

扫码关注云+社区

领取腾讯云代金券