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