首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.net框架系统调用和跨平台功能

.net框架系统调用和跨平台功能
EN

Stack Overflow用户
提问于 2021-07-16 10:27:57
回答 1查看 85关注 0票数 0

我知道这个问题听起来很傻,所以请让我解释一下。我一直在学习如何在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上工作?因为那会有很多工作要做。

谢谢

EN

回答 1

Stack Overflow用户

发布于 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基类库中的任何功能,那么这些功能的实现将根据它运行的平台进行适当的调用。但是,如果您正在构建一个应该支持任何平台的应用程序,那么我们必须注意某些事情

要使您的软件与平台无关,有两个主要要求:

  1. 请勿使用任何未在其他平台上实现的API(包括未在Window外部实现的基类库方法),以及对仅Windows的PInvoke调用,以便不显式使用特定于平台的路径分隔符(即“\”和“/”)。

如果你真的想了解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/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68402724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档