当前位置: 首页 > news >正文

C# 跨设备前后端开发探索

每个人都拥有 好奇心,好奇心驱使着我们总是去尝试做一些有趣的事情。

带起你的好奇心,本文将使用 C# 开发各种各样好玩的东西。


[
C# 跨设备前后端开发探索

本文内容已加入 2019 年 4 月 13 日的广州 .NET 俱乐部第 2 届线下沙龙。

本文内容

    • 0x00 序章
      • 好奇心
      • 先搞起来
    • 0x01 C# 跨设备前后端开发
      • Web 后端
      • Windows 桌面端
      • 公共代码
      • 控制台
      • iOS 端
      • Web 前端
    • 0x02 C# 还能做什么?
    • 0x03 终章

0x00 序章

好奇心

每个人都拥有 好奇心,好奇心驱使着我们总是去尝试做一些有趣的事情。

比如这件事:

手机上打字慢

在好奇心的驱使下,我们立刻 尝试 我们的想法。

我们需要用电脑打字,手机端出字;于是我们需要开发的是一款云输入法。而一个最简单的云驱动的软件需要至少一个 Web 后端、一个桌面端和一个移动端。

还没开始呢,就这么复杂。

需要至少三个端

先搞起来

摆在我们面前的,有两条路可以选:

先掌握所有理论知识再实践

无论什么技术,先搞起来

如果先搞起来,那么我们能够迅速出效果,出产品,出玩具,那么这种成就感会鼓励我们继续完善我们的代码,继续去做更多好玩的东西。

而如果是先掌握所有理论知识再实践,这是我们从学校带来的学习方式,我们中的多数人在校期间就是这么学习的。虽然对学霸来说可以无视,但对于我们这样大多数的小伙伴来说,简直就是“从入门到放弃”。

从入门到放弃

如果先搞起来呢?如果我们连“入门”都不需要呢?是不是就不需要放弃了!

怎么才能够先搞起来?我们需要调整一下心态——我们不是在学,而是在玩!

我们需要做的是降低学习成本,甚至入门不学习,那么立刻就能玩起来!

搞起来

我们有 C#,还有什么不能马上搞起来!

0x01 C# 跨设备前后端开发

打开 Visual Studio 2019,我们先搞起来!

Visual Studio 2019

Web 后端

创建一个 Asp.NET Core Web 应用程序

输入项目的名称

选择 API 开发

对于简单的云服务来说,使用 Asp.NET Core 开发是非常简单快速的。你可以阅读林德熙的博客入门 Asp.NET Core 开发:

  • win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序 - 林德熙

Windows 桌面端

开发 Windows 桌面端

我们是要玩的呀,什么东西好玩。我们自己就是用户,用户看得到的部分才是最具有可玩性的。这就是指客户端或者 Web 前端。

我们现在要拿 C# 写客户端,一般 C# 或者 .NET 的开发者拿什么来写桌面客户端呢?

  • WPF 或者 Windows Forms 应用程序

WPF 程序

Windows Forms 程序

公共代码

我们现在已经有至少两个端了。由于我们是同一个软件系统,所以实际上非常容易出现公共代码。典型的就是一些数据模型的定义,以及 Web API 的访问代码,还有一些业务需要的其他公共代码等等。

所以,我们最好使用一个新的项目将这些代码整合起来。

我们选用 .NET Standard 项目来存放这些代码,这样可以在各种 .NET 中使用这些库。

.NET Standard 类库

控制台

由于我们多数的代码都可以放到 .NET Standard 类库中,以确保绝大多数的代码都是平台和框架无关的,所以实际上我们在其他各个端项目中的代码会是很少的。

这个时候,写一个控制台程序来测试我们的项目,控制台程序的部分其实只需要很少的用于控制控制台输入输出的代码,其他多数的代码例如用来访问 Web API 的代码都是不需要放在控制台项目中的,放到 .NET Standard 的类库中编写就可以做到最大程度的共用了。

控制台程序

iOS 端

接下来要完成这个云键盘程序,我们还需要开发一个移动端。使用 Xamarin 可以帮助我们完成这样的任务。

Xamarin.Forms

Xamarin 自定义键盘扩展

关于使用 Xamarin.Forms 开发一个键盘扩展,可以阅读我的另一篇博客:

  • 使用 Xamarin 开发 iOS 键盘扩展(含网络访问)

Web 前端

于是,我们仅仅使用 C# 还有客户端开发者熟悉的 XAML 就开发出了三个端了。

三个端

这三个端中,有两个都是客户端,于是就会存在向用户分发客户端的问题。虽然可以让用户去商店下载,但是提供一个官方下载页面可以让用户在一处地方找到所有端的下载和部署方法。

这需要使用到前端。然而如何使用 C# 代码来编写去前端呢?

如何使用 C# 来编写前端?

使用 CSHTML5!

你可以前往 CSHTML5 的官网 下载 Visual Studio 的插件,这样你就可以在 Visual Studio 中编写 CSHTML5 的代码了,还有设计器的支持。

CSHTML5 如何编译 C# 和 XAML 代码

0x02 C# 还能做什么?

于是我们使用 XAML + C# 就编写出了各个端了。

各个端

如果没有 GUI,那么跨平台将是非常容易的一件事情。例如我们想要在 Mac 电脑上也做一个打字发送的一方,那么一个控制台应用也是能够直接完成的。

没有 GUI,更容易跨平台

不过,这并不是说,我们只能通过控制台来开发桌面端应用。

我们还有:

  • AvaloniaUI/Avalonia: A multi-platform .NET UI framework
  • Xamarin 版的 WPF 桌面端
  • Xamarin.Mac - 开发 Mac 桌面端
  • GTK# - 开发 Linux 桌面端
  • Tizen .NET - 开发三星物联网系统的 GUI

利用这些平台,我们能开发其他桌面平台的 GUI 客户端。

另外,利用 ML.NET,我们还能用 C# 进行机器学习。可参见:Bean.Hsiang - 博客园。

利用 Roslyn,我们还能用直接做编译器,然后你还有什么不能做的?关于 Roslyn 的入门,可以阅读:从零开始学习 dotnet 编译过程和 Roslyn 源码分析 - walterlv。

还有 IoT。

还有其他……

0x03 终章

每个人都拥有 好奇心,好奇心驱使着我们总是去尝试做一些有趣的事情。

使用你熟悉的语言 C#,不需要太多额外的入门,即可玩转你身边各种你需要的技术栈,玩出各种各样你自己期望尝试开发的小东西。


我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

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

相关文章:

  • MSBuild 如何编写带条件的属性、集合和任务 Condition?
  • WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码
  • 如何快速自定义 Visual Studio 中部分功能的快捷键
  • C# 8.0 如何在项目中开启可空引用类型的支持
  • C# 8.0 可空引用类型中的各项警告/错误的含义和示例代码
  • C# 可空引用类型 NullableReferenceTypes 更强制的约束:将警告改为错误 WarningsAsErrors
  • ClearType 的原理:Windows 上文本的亚像素控制
  • 使用 7-Zip 的命令行版本来压缩和解压文件
  • 在项目文件 csproj 中或者 MSBuild 的 Target 中使用 % 引用集合中每一项的属性
  • MSBuild 中的特殊字符($ @ % 等):含义、用法以及转义
  • WPF 获取元素(Visual)相对于屏幕设备的缩放比例,可用于清晰显示图片
  • Visual Studio 通过修改项目的调试配置文件做到临时调试的时候不要编译(解决大项目编译缓慢问题)
  • 使用 dotnet 命令行配合 vscode 完成一个完整 .NET 解决方案的编写和调试
  • 如何修改 Visual Studio 新建项目时的默认路径
  • 使用 EnumWindows 找到满足你要求的窗口
  • 【译】JS基础算法脚本:字符串结尾
  • C语言笔记(第一章:C语言编程)
  • es6(二):字符串的扩展
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 关于字符编码你应该知道的事情
  • 类orAPI - 收藏集 - 掘金
  • 利用jquery编写加法运算验证码
  • 写代码的正确姿势
  • 自定义函数
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • (java)关于Thread的挂起和恢复
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (三)Honghu Cloud云架构一定时调度平台
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • [AR Foundation] 人脸检测的流程
  • [BUUCTF]-Reverse:reverse3解析
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [BZOJ3223]文艺平衡树
  • [CF226E]Noble Knight's Path
  • [C语言]——内存函数
  • [dts]Device Tree机制
  • [Flexbox] Using order to rearrange flexbox children
  • [Kubernetes]8. K8s使用Helm部署mysql集群(主从数据库集群)
  • [leetcode] 3Sum
  • [leetcode] Longest Palindromic Substring
  • [Linux] 一文理解HTTPS协议:什么是HTTPS协议、HTTPS协议如何加密数据、什么是CA证书(数字证书)...
  • [Linux](16)网络编程:网络概述,网络基本原理,套接字,UDP,TCP,并发服务器编程,守护(精灵)进程
  • [Linux]使用CentOS镜像与rpm来安装虚拟机软件
  • [NISACTF 2022]level-up
  • [Nuget]使用Nuget管理工具包
  • [poj] 3422 Kaka's Matrix Travels || 最小费用最大流
  • [Unity][VR]透视开发系列4-解决只看得到Passthrough但看不到Unity对象的问题
  • [vue3] 使用 vite 创建vue3项目的详细流程
  • [贰],万能开篇HelloWorld
  • [改善Java代码]别让null值和空值威胁到变长方法
  • [个人]分享ubuntu