什么是.net(dotnet)

9,204次阅读
没有评论

共计 3352 个字符,预计需要花费 9 分钟才能阅读完成。

这是一篇 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 还没有其它东西能全到这个程度吧。

下面说一些开发上的工具:
7. 每个项目都需要一个 csproj 文件,这是个 xml 文件,这个格式其实是 msbuild 格式,msbuild 是一个本来是用于构建.net 项目的工具,类似 ant,visual studio 也使用了这个 msbuild,不管什么项目,都会创建个.xxproj 文件。
8. visual studio 中 .sln 是项目解决方案文件,一个项目解决方案下可以创建多个项目,每个项目都会有一个 msbuild 格式的文件,生成和构建解决方案就是构建全部的项目。msbuild 有很多参数,不同的参数可以组成 debug relese 这样的构建方式。visual studio 下总会有个 properties 目录,这个目录下可以添加各种配置,这些配置是 ide 需要的,可以用于控制如何启动和调试程序,对于 vs 而言,debug 和执行,如果没有特别配置,就是执行和调试的整个项目的构建结果,默认结果生成在 bin 目录下。rider 对于 vs 支持的它都支持,jet 家的软甲交互真的比 vs 好太多了。
9. 包管理是用的 nuget,本身可以作为一个包管理器,它的包安装和使用是在 pakcges 文件夹和 packags,json 中,在.net 中(不特定指定就是.net core)已经被基础进去了,所有项目安装的包,都在系统上的某个目录下,安装了什么包可以在项目中的 csproj(xml) 文件里查看。.net 继承了这个,msbuild + nuget 不就和 maven 一样的作用了。
10. 虽然.net 东西很多,但是他也有一个最基本的 sdk 包,安装了这个就会有一个 dotnet 命令,可以用来安装包,构建,等等。所以这个 dotnet 命令,既可以安装包,也可以构建,还可以执行 c# 代码,等于 java 中的 java + javac + mavn + … 命令的组合了。

参考链接:
11. https://link.zhihu.com/?target=https://learn.microsoft.com/zh-cn/dotnet/core/introduction
12. https://link.zhihu.com/?target=https://learn.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/overview
13. https://link.zhihu.com/?target=https://www.runoob.com/csharp/csharp-tutorial.html#:~:text=C#%20%E6%95%99%E7%A8%8B%20C#%20%E6%98%AF
14. https://link.zhihu.com/?target=https://learn.microsoft.com/zh-cn/nuget/consume-packages/overview-and-workflow
15. https://link.zhihu.com/?target=https://learn.microsoft.com/zh-cn/visualstudio/extensibility/internals/solution-dot-sln-file?view=vs-2022
16. https://www.zhihu.com/question/377803052#:~:text=C# 是.NET 战略下

原文地址: 什么是.net(dotnet)

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-09-30发表,共计3352字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)