2

我正在尝试对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 吗?如果是这样,那意味着什么?

4

1 回答 1

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);
}

所以真正的问题是:可以Activator.CreateInstance合法地返回null。答案是YES,它可以在某些条件下返回 null 。我发现的一个示例是创建可为空的类型(请参阅此 SO question),但我确信还有其他示例。

于 2013-07-16T09:36:26.140 回答