c# - System.Object.GetType 如何抛出 NullRefernceException

标签 c# .net clr

我的 .NET 应用程序因 NullReferenceException 而崩溃。有趣的是日志显示了这个:

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

令我困惑的是,异常发生在 GetType 内部,而不是在调用 GetType 的那一行。我测试了以下情况。

如果我在一个空对象上调用 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,如果您能提供概念验证代码,我将永远感激不已。 感谢您的宝贵时间。

最佳答案

一种方法是使用 call 调用 GetType 方法(“在”null 引用上)指令,而不是 C# 通常使用的 callvirt 指令。这将防止发生pre 方法调用运行时空值检查。取而代之的是,空引用将传递给该方法,从而导致异常在方法本身内部被抛出。

例如,使用 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 )

关于c# - System.Object.GetType 如何抛出 NullRefernceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9424670/

相关文章:

c# - 指向站点某个区域的另一个域

c# - 从文件系统中删除文件时线程被中止错误

c# - 使用 C# 与 Windows 更新交互

c# - 有没有办法将类字段标记为只反序列化而不序列化?

c# - C# 对象在不可访问时是否从内存中删除

c# - 我使该方法返回什么类型?

c# - 复杂密码的正则表达式

c# - 在 Entity Framework 中使用派生类而不是抽象类型

c# - 如何检查我的 .NET 程序集的新鲜度?

c# - 为什么 Convert.ToInt32(1.0/0.00004) != (Int32)(1.0/0.00004)