如何组织一个同时面向 UWP/WPF/.Net Core 控制台的 C# 项目解决方案
希望写一个小型工具,给自己和需要的人。考虑到代码尽可能的复用,我准备采用 .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 中看起来大概是这样的:
如何组织一个同时面向 UWP/WPF/.Net Core 控制台的 C# 项目解决方案的更多相关文章
- 使用 WebView2 封装一个生成 PDF 的 WPF 控件
使用 WebView2 封装一个生成 PDF 的 WPF 控件 最近在迁移项目到 .net6,发现项目中用的 PDF 库不支持 .net6,于是想着换一个库.结果找了一大圈,发现不是版本不支持,就是收 ...
- Windows 下的高 DPI 应用开发(UWP / WPF / Windows Forms / Win32)
本文将介绍 Windows 系统中高 DPI 开发的基础知识.由于涉及到坐标转换,这种转换经常发生在计算的不知不觉中:所以无论你使用哪种 Windows 下的 UI 框架进行开发,你都需要了解这些内容 ...
- 在VS中手工创建一个最简单的WPF程序
如果不用VS的WPF项目模板,如何手工创建一个WPF程序呢?我们来模仿WPF模板,创建一个最简单的WPF程序. 第一步:文件——新建——项目——空项目,创建一个空项目. 第二步:添加引用,Presen ...
- eShopOnContainers 是一个基于微服务的.NET Core示例框架
找到一个好的示例框架很难,但不是不可能.大多数是小型Todo风格的应用程序,通常基于SimpleCRUD.值得庆幸的是,Microsoft已经为eShopOnContainers创建了一个基于微服务的 ...
- ElasticJob 3.0.0:打造面向互联网生态和海量任务的分布式调度解决方案
ElasticJob 于 2020 年 5 月 28 日重启并成为 Apache ShardingSphere 子项目.新版本借鉴了 ShardingSphere 可拔插架构的设计理念,对内核进行了大 ...
- 一个 "开箱即用" 个人博客全栈系统项目!vue+node+express+mysql+sequlize+uniapp
" MG'Blog " 一个 "开箱即用" 个人博客全栈系统项目! 探索本项目的源码 » 前台预览 · 管理端预览 v1.0.2 小程序预览 v1.0.2 介绍 ...
- 面向云的.net core开发框架
目录结构 1 为什么搭建面向云的.Net core云开发框架 2 主要设计思路 3 项目解决方案 4 基础设施层 4.1反射工具 4.2多级可换源的配置(上) 42多级可换源的配置(下) 4.3可配置 ...
- 介绍一个可以将Expression表达式树解析成Transact-SQL的项目Expression2Sql
一.Expression2Sql介绍 Expression2Sql是一个可以将Expression表达式树解析成Transact-SQL的项目.简单易用,几分钟即可上手使用,因为博主在设计Expres ...
- WPF应用程序支持多国语言解决方案
原文:WPF应用程序支持多国语言解决方案 促使程序赢得更多客户的最好.最经济的方法是使之支持多国语言,而不是将潜在的客户群限制为全球近70亿人口中的一小部分.本文介绍四种实现WPF应用程序支持多国语言 ...
随机推荐
- Gray Code,求格林码
问题描述: The gray code is a binary numeral system where two successive values differ in only one bit. G ...
- Java线程池可用的队列
Java线程池ThreadPoolExecutor的构造器: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long ...
- canvas实现鼠标拖拽矩形移动改变大小
项目的一个新需求,动态生成矩形框,鼠标点击拖动改变矩形框的位置,并可以调整大小. 之前做过一个小demo,需求类似,但是在canvas内只有一个矩形框,拖动移动,当时记得是用isPointInPath ...
- 马哥教育python网络班19期 学习目标
马哥教育python网络班19期 学习目标: (1)按群里的学习进度表,来自行学习,学完时间6个月. (2)学完后,薪资能达到20K+每月.
- 1-10 RHLE7 系统进程管理
1.1-Linux进程管理 程序.进程.线程 程序:一组指令的集合 QQ 进程:程序的执行就是进程.也可以把进程看成一个独立的程序,在内存中有其对应的代码空间和数据空间,一个进程所拥有的数据和代 ...
- [nodejs]解决mysql和连接池(pool)自动断开问题
最近在做一个个人项目,数据库尝试使用了mongodb.sqlite和mysql.分享一下关于mysql的连接池用法.项目部署于appfog,项目中我使用连接池链接数据库,本地测试一切正常.上线以后,经 ...
- nginx默认配置
user nobody; worker_processes 2; worker_cpu_affinity 000000001000 000000010000; worker_rlimit_nofile ...
- URAL 1557 Network Attack 图论,连通性,tarjain,dfs建树,分类讨论 难度:2
http://acm.timus.ru/problem.aspx?space=1&num=1557 1557. Network Attack Time limit: 2.0 secondMem ...
- 【zznu-2060】 Minsum Plus(最小正子段和)
题目描述 题意简单到令人发指! 序列A由N个整数组成,从中选出一个连续的子序列,使得这个子序列的和为正数,且和为所有和大于零的子序列中的最小值. 将这个值输出,若无解,输出no solution. 输 ...
- 【微软混合现实】开始使用Unity-第一章:创建一个新的项目
使用Unity开发App,第一步需要创建一个项目.项目具有一系列组织好文件夹,其中最重要的是你的附件文件夹(Assets folder).在这个文件夹中,存储了从其他工具中创建的数字内容,比如Maya ...