.NET中有多少是非托管的?

4

我经常使用反编译器时,会遇到很多不安全的代码。有人知道.NET有多少是非托管/安全的吗?


你具体指的是.NET的哪个部分?除非你自己将代码标记为不安全,否则你的代码不会是不安全的。 - Alex Fort
这个问题怎么回答呢?你想要代码行数之类的度量吗? - Ken Browning
基本上任何部分,比如查看列表、数组类。 - Joan Venge
.NET 有多少种类型可以用数字回答,但我更想要一个大概的百分比估计。 - Joan Venge
请注意,未托管和不安全是非常不同的东西。 - Mark Hurd
4个回答

6
有许多PInvoke实例只是调用Win32 API。但是,CLR本身实现了一些功能(例如Interlocked操作)。如果您想查看如何完成此操作,请查看Rotor
我在我的博客中的这篇文章中详细解释了锁定(查看Rotor源代码)。
要具体回答您的问题,您必须获取所有.NET源代码(例如使用NetMassDownloader并搜索包含“InternalCall”或“DllImport”的行),然后将其与所有行数进行比较。也许您可以将每个这些“非托管”行乘以某个因子来猜测,或者您必须深入Rotor或Windows源代码以获取实际数字。如果您走得这么远,事情会变得模糊(例如,如果File.Open调用Win32的CreateFile,则应将CreateFile计入.NET吗?我认为不应该)。因此,最好您只能将“InternalCall”乘以某个因子来猜测。

6

这是一个非常难回答的问题。不安全的代码很容易量化,因为它存在于二进制文件中,并且可以用IL指令来衡量。

真正的非托管代码,例如PInvoke或COM,在二进制文件中确实有代码,但是其规模微不足道。它只代表调用本地函数所必需的最小存根。这意味着您无法真正衡量托管DLL中正在执行多少本机代码。您能做的就是测量调用次数,这并不能真正衡量正在执行多少非托管代码。


1

许多System.Windows.Forms调用未管理的Windows API,但我没有发现需要手动处理在此命名空间中创建的对象的需要。

当使用System.IO.FileStream类(也调用未管理的代码)时,请确保在完成后调用Dispose,以便您可以保证文件在那里关闭,而不是在终结器执行时。


一个对象实现IDisposable接口是有原因的。如果你没有处理这些对象,你可能看不到问题,但很可能会导致内存泄漏。 - Ed S.

0

这并不重要,因为不安全的调用被相应的.NET对象包装起来了。你需要关注的是资源分配和处理实现IDisposable接口的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接