AppDomain.CreateInstanceAndUnwrap可以返回null吗?

时间:2013-07-15 20:16:49

标签: c# .net appdomain

我正在尝试解决生产系统上发生的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吗?如果是这样,那意味着什么?

1 个答案:

答案 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),但我确信还有其他例子。