我知道这个问题听起来很傻,所以请让我解释一下。我一直在学习如何在windows上用c#编程,而且一直做得很好。不过,我最近意识到的一件事是,我不太确定它是如何工作的。我知道基础知识,例如,我知道c#会被编译成CIL,或者MSIL。然后通过JIT编译器运行,该编译器生成实际运行本机代码。
但是,当我们查看.net框架的跨平台功能时,我会感到困惑。
从我对其他平台上的其他语言的研究中,我了解了系统调用,以及当程序使用硬件系统(例如硬盘驱动器)时,系统调用是如何必不可少的。现在,在linux上的C中,当您调用像fopen()这样的函数时,linux上的C标准库最终会对linux进行系统调用,以执行fopen()的实际工作。一旦操作系统完成,它就会返回到调用程序。
现在,我想c#/.net框架也是类似的,对吗?因此,当我输入file.open(something);时,它以某种方式结束对win32 API的调用,该API处理操作,然后返回到程序。这个假设是正确的吗?
如果这是正确的,那么c#是如何跨平台的呢?如果当我编写file.open();时,它会调用linux,那么它怎么能在win32上的单声道中运行得很好呢?如果它在linux上调用win32 API,它应该会失败,因为那里不存在这个API。
那么,调用OS的是.net框架库吗,类似于C?或者是JIT编译器在最终编译发生时进行实际调用,这取决于它运行在什么平台上?
那么最终的管道是这样的吗?->
-c#,file.open(something)被编译成-><
将MSIL语言中的等效命令-MSIL编译为->
-native代码,通过系统调用调用操作系统应用程序接口,win32应用程序接口或linux应用程序接口
(我只是想要一个粗略的过程概述,不需要深入的细节)
其次,当Mono的开发人员创建mono时,他们是否只需要一次一个类,一个方法一个方法地遍历整个.net框架库,并且必须重新创建它才能在linux上工作?因为那会有很多工作要做。
谢谢
发布于 2021-07-16 11:27:18
文件系统是一种操作系统资源,.NET核心和.NET框架中的I/O方法都对底层操作系统进行包装调用。下面的图片解释了.NET如何使用非.NET代码(使用RCW和RCW)。

参考:managed-code-and-unmanaged-code-in-net
下面是另一张图片,它可能有助于了解哪些平台上提供了哪些功能

参考:cross-platform-capabilities-of-dot-net
现在我们需要了解的是,如果您正在使用.NET基类库中的任何功能,那么这些功能的实现将根据它运行的平台进行适当的调用。但是,如果您正在构建一个应该支持任何平台的应用程序,那么我们必须注意某些事情
要使您的软件与平台无关,有两个主要要求:
如果你真的想了解CLR是如何工作的,我强烈推荐这本书。

http://sd.blackball.lv/library/CLR_via_CSharp_(Jeffrey_Richter_4th_Edition).pdf
参考资料:
https://www.c-sharpcorner.com/uploadfile/puranindia/managed-code-and-unmanaged-code-in-net/ https://docs.microsoft.com/en-us/dotnet/standard/io/handling-io-errors https://headspring.com/2018/07/10/cross-platform-capabilities-of-dot-net/
https://stackoverflow.com/questions/68402724
复制相似问题