首页 / 笔记本 / .NET9 Linux/.net9 linux桌面开发

.NET9 Linux/.net9 linux桌面开发

.NET9 Linux,一起来看看吧,希望能帮助到您,更多请关注本网站。

.NET9 Linux

1.前言

之前聊过Windows下面Console.WriteLine的运行过程常用Console.WriteLine原理,你知道吗?本篇看下它在Linu-x64下面最新.NET9运行过程

2.托管代码

在.NET中,通常使用StreamReader和StreamWriter这两个类来进行流读写操作,它们的命名空间位于System.IO中。这些类包含在托管库System.Runtime.dll中。下面是一个简单的示例操作:

using (StreamWriter writer = File.CreateText("newfile.txt"))
{
await writer.WriteLineAsync("First line of example");
await writer.WriteLineAsync("and second line");
}

登录后复制

StreamWriter和StreamReader分别派生自TextWriter和TextReader。Console.WriteLine打印出的字符串,则是在CLR库里面直接通过TextWriter写入到的数据流/设备。

比如例子:

.NET9 Linux/.net9 linux桌面开发

static void Main(string[] args)
{
 Console.WriteLine("Call Main");
}

登录后复制

Console.WriteLine会调用Out.EnsureInitialized函数,Out即是TextWriter类型,代码如下:

源码地址:https://github.com/dotnet/runtime/blob/main/src/libraries/System.Console/src/System/Console.cs

public static TextWriter Out
{
get
{
static TextWriter EnsureInitialized()
{
lock (s_syncObject)
{
if (s_out == null)
{
Volatile.Write(ref s_out, CreateOutputWriter(ConsolePal.OpenStandardOutput()));
}
return s_out;
}
}
}
}

登录后复制

EnsureInitialized函数里面调用了Volatile.Write函数,Volatile.Write函数的意思是,把参数二的值写入到参数一字段里面去。这里的解释就是把CreateOutputWriter(ConsolePal.OpenStandardOutput())返回的值写入s_out字段,s_out也是TextWriter类型。

这里看下CreateOutputWriter(ConsolePal.OpenStandardOutput())返回的值是啥。CreateOutputWriter函数如下:

源码地址:https://github.com/dotnet/runtime/blob/main/src/libraries/System.Console/src/System/Console.cs


private static TextWriter CreateOutputWriter(Stream outputStream)
{
return outputStream == Stream.Null ?
TextWriter.Null :
TextWriter.Synchronized(new StreamWriter(
stream: outputStream,
encoding: OutputEncoding.RemovePreamble(), 
bufferSize: WriteBufferSize,
leaveOpen: true)
{
AutoFlush = true
});
}

登录后复制

可以看到CreateOutputWriter返回的依旧是TextWriter,也就是说Volatile.Write把流数据写入到流数据,然后从设备上打印出来。

这里写入的流数据值到底是什么呢?继续看ConsolePal.OpenStandardOutput()函数,它返回的是Stream类型。

源码地址:
https://github.com/dotnet/runtime/blob/main/src/libraries/System.Console/src/System/ConsolePal.Unix.cs


public static Stream OpenStandardOutput()
{
return new UnixConsoleStream(Interop.CheckIo(Interop.Sys.Dup(Interop.Sys.FileDescriptors.STDOUT_FILENO)), FileAccess.Write);
}

登录后复制

这里是Linux/Unix下面的操作,OpenStandardOutput里面实例化了一个UnixConsoleStream类,UnixConsoleStream的构造函数里面,第一个参数是Interop.CheckIo(Interop.Sys.Dup(Interop.Sys.FileDescriptors.STDOUT_FILENO))。Interop.Sys.Dup是Linux下面进行文件表项操作的函数。CheckIo则是个检查函数,此处可以忽略。

举个例子,一般的来说Linux下面在终端打印一个hello World通常通过printf(“hello Word”)

printf -> stdout(标准输出) -> Dup(STDOUT_FILENO) ->终端输出

登录后复制

可见Linux下面是通过Dup函数传递参数STDOUT_FILENO进行终端操作的,UnixConsoleStream第二个参数是FileAccess.Write,表示写入字符串。然后把这个Stream封装后返回,通过Volatile.Write写入到终端流里面打印出来。

那么其实很清晰了,流程大致如下:

Console.WriteLine ->Out.EnsureInitialized -> ConsolePal.OpenStandardOutput() -> I

登录后复制本文.NET9 Linux整理到此结束,字数约3353字,希望对大家有所帮助。本网站往后会继续推荐.NET9 Linux相关内容。

.NET9 Linux/.net9 linux桌面开发 笔记本 第2张
.NET9 Linux/.net9 linux桌面开发.docx
将本文的Word文档下载到电脑,方便收藏和打印
推荐度: .NET9 Linux/.net9 linux桌面开发 笔记本 第3张 .NET9 Linux/.net9 linux桌面开发 笔记本 第3张 .NET9 Linux/.net9 linux桌面开发 笔记本 第3张 .NET9 Linux/.net9 linux桌面开发 笔记本 第3张 .NET9 Linux/.net9 linux桌面开发 笔记本 第3张
.NET9 Linux/.net9 linux桌面开发 笔记本 第8张 点击下载文档文档为doc格式
电脑装机: 服务热线:15881186112或添加微信:shiwukuaixiu 提供电脑组装diy服务,各个品牌笔记本芯片级维修;专业技术员在线提供技术支持、故障疑问等解答!本文链接:https://www.9c9t.com/bjb/46523.html
上一篇
下一篇

为您推荐

联系我们

联系我们

15881186112

在线咨询: QQ交谈

邮箱: 156202420@qq.com

工作时间:周一至周日,9:00-18:00,节假日正常上班
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部