我正在尝试解决生产系统上发生的NullReferenceException
问题。如果可以信任堆栈跟踪中的行号,那么它似乎表明AppDomain.CreateInstanceAndUnwrap
返回null:
this.jobRunner =
(JobRunner)this.appDomain.CreateInstanceAndUnwrap(assemblyName, typeName);
// ...
try
{
this.jobRunner.Run(this.job); // <== NullReferenceException occurs here
}
但是,MSDN Library没有明确说明null是一个可能的返回值:
返回值
键入:System.Object
由 typeName 指定的对象的实例。
我的问题: AppDomain.CreateInstanceAndUnwrap
能合法地返回null吗?如果是这样,那意味着什么?
答案 0 :(得分:3)
是的,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);
}
所以真正的问题是:can Activator.CreateInstance
合法地返回null。答案是 YES ,它可以在某些条件下返回null。我发现的一个例子是创建可以为空的类型(参见this SO question),但我确信还有其他例子。