我正在尝试对生产系统上发生的 NullReferenceException
进行故障排除。如果堆栈跟踪中的行号可信,那么似乎表明 AppDomain.CreateInstanceAndUnwrap 返回 null:
this.jobRunner =
(JobRunner)this.appDomain.CreateInstanceAndUnwrap(assemblyName, typeName);
// ...
try
{
this.jobRunner.Run(this.job); // <== NullReferenceException occurs here
}
但是,MSDN Library没有具体说明 null 是可能的返回值:
Return Value
Type: System.Object
An instance of the object specified by typeName.
我的问题:AppDomain.CreateInstanceAndUnwrap
可以合法返回 null 吗?如果是这样,那意味着什么?
最佳答案
是的,AppDomain.CreateInstanceAndUnwrap
可以合法地返回 null。
以下是该方法的反射代码(使用 .NET Reflector):
[SecuritySafeCritical]
public object CreateInstanceAndUnwrap(string assemblyName, string typeName)
{
ObjectHandle handle = this.CreateInstance(assemblyName, typeName);
if (handle == null)
{
return null;
}
return handle.Unwrap();
}
更深入我们得到:
[SecuritySafeCritical]
public ObjectHandle CreateInstance(string assemblyName, string typeName)
{
if (this == null)
{
throw new NullReferenceException();
}
if (assemblyName == null)
{
throw new ArgumentNullException("assemblyName");
}
return Activator.CreateInstance(assemblyName, typeName);
}
所以真正的问题是:Activator.CreateInstance
能否合法返回 null。答案是YES,在某些条件下它可以返回null。我发现的一个示例是创建可为 null 的类型(请参阅 this SO question ),但我确信还有其他示例。
关于c# - AppDomain.CreateInstanceAndUnwrap 可以返回 null 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17663097/