我知道一些.NET Framework库(FCL)封装了Windows API调用,但我不知道有多less。 所有的? 大部分? 只有一点点?
比方说,我只使用托pipe代码在C#中编写典型的Winforms业务应用程序。 在我的“pipe理”应用程序中,有多less是真的“不受pipe理”的?
比方说,我只使用托管代码在C#中编写典型的Winforms业务应用程序。 在我的“管理”应用程序中,有多少是真的“不受管理”的?
在Windows窗体中,几乎所有东西都是托管的Windows API的薄包装。 Windows窗体控件甚至通过Handle属性公开他们的本地控制句柄。
也就是说,如果使用WPF,则更多的底层逻辑是用托管代码编写的。 当然,在某种程度上,事情总是会被操作系统掏空 – 但是框架(WPF,WCF等等)的大部分是用托管代码编写的更高级别的抽象,这些抽象建立在本地API的较低级别的包装之上。
这就是说,托管代码与本地核心的级别差别很大,具体取决于所讨论的类型。 然而,这样做的好处在于,使用.NET,您实际上不必关心底层实现是本机还是托管,只需要关心是否需要通过IDisposable
或类似工具进行清理的资源。
如果你想要一个纯粹的技术答案,整个应用程序,在一些较低的点,是不受管理的。 但是,因为你是从.NET的角度来问…
这真的取决于应用程序的功能。 在使用winforms的时候,应用程序会使用更多的其他类型(比如绘图库)。 添加一些Internet功能,套接字等,依赖的数量增加。
您拥有的自定义代码越多,不使用.NET库,CLR管理的百分比就越高。 .NET中的许多“辅助”函数也是如此。 在框架中,任何通信代码都将归结为非托管代码。 图形库也是如此。 如果我想再长一点,我也可以碰别人。
我对Windows窗体应用程序的猜测。 当您抓取堆栈时,大部分代码的一部分都是非托管的。
在我的“管理”应用程序中,有多少是真的“不受管理”的?
100%的。 托管只是生活在一个非托管的操作系统的顶部,这当然生活在非托管的硬件上。
所有的? 大部分? 只有一点点?
我的意思是,我不知道你想如何量化它。 公共表面方法? 代码行? 全世界所有C#代码的方法调用总数? 但是谁真的在乎呢? .NET(WinForms,WPF)中的大部分UI Windows-y代码都将在某些时候通过Win API进行。 所以还有很多其他代码,比如与文件系统交互的代码,WCF,ADO.NET等等。
什么工程问题,这将帮助你解决?
多年来,.NET运行库和类库的源代码已经有了各种版本。 不是每个发行版本,也不是所有的代码,但它的好块。 所以你可以从这个开始,并评估自己管理和非管理之间的关系。
我记得在版本1.0发布的时候查看“参考源代码”,并且惊喜地发现有多少类库(比如字符串类,正则表达式类,XML类等等)是用托管的C#代码编写的。 而使用OS服务(如线程,互斥,文件I / O)的最低层的类是P'Invoking到Win32。 但那是很久以前的事了。