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

Inner Exception System.NullReferenceException: Object reference not set to an instance of an object.
           at System.Object.GetType()

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

如果我在一个null对象上调用GetType,则异常发生在调用GetType的行上,而不是在GetType内。
我也尝试过How can I get a NullReferenceException in this code sample?但很奇怪
我在Program.Main中得到了异常,而不是在Object.GetType中(尽管在那篇文章中它在GetType中)。

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

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

最佳答案

一种方法是使用 GetType 指令而不是C#通常使用的null指令调用call方法(在callvirt -reference上)。这将防止发生方法前调用运行时空检查。相反,会将空引用传递给该方法,从而将异常引发到方法本身内部。

例如,使用InvokeNonVirtual示例provided here,您可以执行以下操作:

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

InvokeNonVirtual(method, args);

这将生成一个TargetInvocationException,其中InnerException是具有堆栈跟踪的NullReferenceException:
at System.Object.GetType()
at NonVirtualInvoker(Object )

10-08 03:59
查看更多