2009-03-04 59 views
4

当我使用Reflector时,我经常遇到很多不安全的代码。任何人都知道.NET有多少是不受管理/安全的?有多少.NET是非托管的?

+0

.NET中的哪一部分是你正在谈论的?除非您自己指定代码不安全,否则您的代码不会不安全。 – 2009-03-04 21:30:32

+0

这将如何负责?你想要测量代码行吗? – 2009-03-04 21:32:37

+0

几乎所有的部分都像查看列表,数组类。 – 2009-03-04 21:32:55

回答

0

因为不安全的调用被相应的.NET对象封装,所以它并不重要。你需要关心的是资源分配和处理实现IDisposable的对象。

6

有许多PInvoke实例只是调用Win32 API。但是,在CLR本身中实现了一些功能(例如,互锁操作)。如果你想看看如何完成,请看Rotor

我在我的博客上对this post进行了锁定(查看转子源)的详细说明。

要明确回答您的问题,您必须获取所有.NET源代码(例如,使用NetMassDownloader和grep表示“InternalCall”或“DllImport”),并将其与所有行的计数进行比较。也许你可以将这些“非托管”行中的每一行乘以某个要素来猜测,或者你必须潜入Rotor或Windows源代码才能得到实际的数字。如果你走了这么远,那么事情就会变得模糊(例如,如果File.Open调用Win32的CreateFile,那么CreateFile应该算在.NET上?我想不是)。所以,充其量只能通过一些因素来推测“InternalCall”。

1

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

当使用System.IO.FileStream类(也调用非托管代码)时,请确保在完成后调用Dispose,以便可以保证文件在那里关闭,然后代替执行终结器。

6

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

真正的非托管代码,比如说PInvoke或者COM,在二进制文件中有代码,但是它并不重要。它只表示调用本机函数所需的最小存根。这意味着您无法真正衡量在受管DLL中正在执行多少本机代码。你所能做的就是测量调用的数量,它不能真正衡量非托管代码执行的程度。