什么是.net(dotnet)

这是一篇c#学习笔记,学习了两三天,看了一些教程,一开始感觉迷迷糊糊的,经过一些热心朋友的建议,没有让我取消继续看的想法,感觉终于理解个差不多了,不明白整体的关系感觉真的不知道如何下手,总感觉像是摸着石头过河不怎么带劲。

一开始是跟着菜鸟教程学的,只学了个语法,感觉跟java 差不多,官网说是都是类c语言,c#惊艳我的语法是,支持await async ,linq。居然支持预编译,方法扩展,结构体等。语法就不说了,之前写java js c++的都能很快上手,学完语法,我就下载了个visual studio,看起来创建就生成了一个cs文件,但是不用ide打开资源管理器,看到了一堆文件,不知道作用是什么,然后我就去用rider了,还是jet家的软件用着舒服,还是会生成那些文件,运行的时候我还以为可以在随便一个cs文件上右键一下就能运行,但是不行,只能以项目的方式去运行,然后我对引入的一些库 .net,不知道他们的作用是什么,但是总归还是能运行,打印出了 hello word 。也成功编译成了二进制的exe,但是这个exe居然在没有安装.net电脑不能运行,于是令我困惑的.net是什么一直围绕着我一整天,以下是看了一些文档之后的总结,也许还是不正确,但是勉强在逻辑上能解答我的困惑,如有错误欢迎指出。

  1. 官网给.net的定义是,.net is application platform 。那么什么叫做应用平台呢,这俩词经常见组合一起还是惊了我一下,不知道具体是什么,问了gpt看了一些文章了,我觉得就是,"一个运行特定的应用软件的开发平台",这个平台提供sdk,你通过这些sdk中的api写出来代码,通过这个平台编译成它需要的结果,并在这个平台上运行。
  2. .net framework 以前是不开源的,只能运行在windows,后来出现了Mono,可以跨平台,unity用的就是mono,然后微软2016年推出了 .net core ,就是新版的开源跨平台.net 功能和.net framework一样多,api也尽量一致。现在微软上的文章,.net 如果没有特别声明,指的就是 .net core 开源项目,这个直接就是跨平台的。
  3. .net主要的组成如下:
    运行时,就像java的jvm
    库,就像java提供的jar api系统包。
    编译器,包管理,构建等工具。
    CLI 中间语言,类似java的字节码格式。
    各种运行库,从web 桌面 移动 等。
  4. 运行机制,asp.net 给我最大的印象是上学的时候,课本上把这个和php jsp 在一起比较,其实现在asp.net 只是一个库,并不仅仅做动态网页,还包含着类似spring mvc的mvc框架库。.net支持三种语言,c# f# vb 但是,标准库只有一个,三个语言都可以调用,这是因为标准库不是固定的c# 或者F#代码,而是中间代码cli这个就很类似java或者js的字节码,f# c#谁调用都行,这三个语法就等同于,字节码支持 java Kotlin Scala 等语言一样,字节码上不同的语言开发者不同,给的标准库也不同,所以没法互相调用 .net上的语言都是微软定义的,实现了可以调用同一个标准库。所以net上的编写的代码,最后都会先变成编译成中间代码,但是不会像java一样,直接让vm运行字节码,虽然jvm最后也会通过即时编译成为指令码执行,.net直接编译成了指令码,但是运行的时候,依然需要.net提供运行环境。因为构建的时候并不是将代码中所有的功能一起构建了,只是构建部分代码本身,这些api真正的执行程序,还在系统的dll中,这叫做动态链接吧。所以c#还是免不了体积大,c这样的话,一般默认都是静态编译,这个代码量就很多,用到什么就会编译什么,所以编译时间都很长(当然都可以选择动态链接加快时间),go就很特别,他没有中间语言,直接静态编译,把运行时构建在一起,但是它本身又不像rust c的,它没有动态链接功能,所以很精简。因为语法不多,api也不多,所以编译起来也不慢。如果不是go的语法这么特殊,我觉得还是挺好用的( 这部分表达的不够准确,大概是这个意思)。
  5. 还有一个就是,虽然运行时很大,但是程序运行起来,如果没有调用某些函数,所占内存其实不会很大,java也是,还有nodejs 随便把node加进去不都得一百多MB,但是程序不大的话其实也就占个及时兆,甚至10MB以内。
  6. .net 等同于 jdk + spring + spring mvc + jsp + tomcat + 安卓,像java 只负责语法 和运行虚拟机,应用实现,做web,做移动,做pc 还是都需要第三方来开发支持,而 .net微软全部都一起支持完了,所以叫做application platform 看起来就很合理了,至今除了.net还没有其它东西能全到这个程度吧。

下面说一些开发上的工具:

  1. 每个项目都需要一个 csproj文件,这是个xml文件,这个格式其实是msbuild格式,msbuild是一个本来是用于构建.net项目的工具,类似ant ,visual studio 也使用了这个msbuild,不管什么项目,都会创建个.xxproj文件。

  2. visual studio 中 .sln是项目解决方案文件,一个项目解决方案下可以创建多个项目,每个项目都会有一个msbuild格式的文件,生成和构建解决方案就是构建全部的项目。msbuild 有很多参数,不同的参数可以组成debug relese这样的构建方式。visual studio 下总会有个properties目录,这个目录下可以添加各种配置,这些配置是ide需要的,可以用于控制如何启动和调试程序,对于vs而言,debug和执行,如果没有特别配置,就是执行和调试的整个项目的构建结果,默认结果生成在bin目录下。rider对于vs支持的它都支持,jet家的软甲交互真的比vs好太多了。

  3. 包管理是用的nuget,本身可以作为一个包管理器,它的包安装和使用是在pakcges文件夹和packags,json中,在.net中(不特定指定就是.net core)已经被基础进去了,所有项目安装的包,都在系统上的某个目录下,安装了什么包可以在项目中的csproj(xml)文件里查看。.net继承了这个,msbuild + nuget 不就和maven一样的作用了。

  4. 虽然.net东西很多,但是他也有一个最基本的sdk包,安装了这个就会有一个dotnet命令,可以用来安装包,构建,等等。所以这个dotnet命令,既可以安装包,也可以构建,还可以执行c#代码,等于java中的 java + javac + mavn + ... 命令的组合了。

参考链接:

  1. https://link.zhihu.com/?target=https%3A//learn.microsoft.com/zh-cn/dotnet/core/introduction

  2. https://link.zhihu.com/?target=https%3A//learn.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/overview

  3. https://link.zhihu.com/?target=https%3A//www.runoob.com/csharp/csharp-tutorial.html%23%3A\~%3Atext%3DC%23%2520%25E6%2595%2599%25E7%25A8%258B%2520C%23%2520%25E6%2598%25AF

  4. https://link.zhihu.com/?target=https%3A//learn.microsoft.com/zh-cn/nuget/consume-packages/overview-and-workflow

  5. https://link.zhihu.com/?target=https%3A//learn.microsoft.com/zh-cn/visualstudio/extensibility/internals/solution-dot-sln-file%3Fview%3Dvs-2022

  6. https://www.zhihu.com/question/377803052#:\~:text=C#是.NET战略下

相关推荐
WineMonk10 小时前
.NET WPF CommunityToolkit.Mvvm框架
.net·wpf·mvvm
界面开发小八哥10 小时前
界面控件DevExpress WPF中文教程:Data Grid——卡片视图设置
.net·wpf·界面控件·devexpress·ui开发
九鼎科技-Leo21 小时前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
九鼎科技-Leo1 天前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发1 天前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf
九鼎科技-Leo1 天前
在 C# 中,ICollection 和 IList 接口有什么区别?
windows·c#·.net
时光追逐者1 天前
C#/.NET/.NET Core学习路线集合,学习不迷路!
开发语言·学习·c#·asp.net·.net·.netcore·微软技术
Crazy Struggle1 天前
.NET 全功能流媒体管理控制接口平台
.net·开源项目·流媒体
.net开发1 天前
WPF使用prism框架发布订阅实现消息提示
c#·.net·wpf