System.Object.GetType如何抛出NullRefernceException

Iva*_*van 5 .net c# clr

我有.NET应用程序,崩溃了NullReferenceException。有趣的是,日志显示如下:

Inner Exception System.NullReferenceException: Object reference not set to an instance of an object.
           at System.Object.GetType()
Run Code Online (Sandbox Code Playgroud)

令我感到困惑的是,该异常发生在GetType内部,而不是在调用GetType的行上。我已经测试了以下情况。

如果我在一个null对象上调用GetType,则异常发生在调用GetType的行上,而不是在GetType内。我也尝试过如何在此代码示例中获取NullReferenceException?但是奇怪的是我在Program.Main中得到了异常,而不是在Object.GetType中(尽管在那篇文章中它在GetType中)。

我还尝试了同时创建对象和调用GetType的尝试,但总而言之,在创建.net对象时没有窗口,其中GetType抛出NullReferenceException。我现在唯一想到的是,这可能是某些较旧的.NET实现的行为。

因此,无论如何在GetType中引起NullReferenceException的任何想法,如果可以提供概念证明代码,我将万分感激。感谢您的时间。

Ani*_*Ani 4

一种方法是使用指令调用GetType方法(“在”引用上null),call而不是使用callvirtC# 通常使用的指令。这将防止发生方法调用运行时空检查。相反,空引用将传递给方法,导致在方法本身内部引发异常。

例如,使用此处提供的InvokeNonVirtual示例,您可以执行以下操作:

var method = typeof(object).GetMethod("GetType");
object[] args = { null };

InvokeNonVirtual(method, args);
Run Code Online (Sandbox Code Playgroud)

这会产生一个具有堆栈跟踪的TargetInvocationException内容:InnerExceptionNullReferenceException

at System.Object.GetType()
at NonVirtualInvoker(Object )
Run Code Online (Sandbox Code Playgroud)