Может ли AppDomain.CreateInstanceAndUnwrap когда-либо возвращать значение null?

Я пытаюсь устранить NullReferenceException проблему в производственной системе. Если номеру строки в трассировке стека можно доверять, то это может указывать на то, что AppDomain.CreateInstanceAndUnwrap вернул null:

this.jobRunner =
    (JobRunner)this.appDomain.CreateInstanceAndUnwrap(assemblyName, typeName);
// ...

try
{
    this.jobRunner.Run(this.job); // <== NullReferenceException occurs here
}

Однако в библиотеке MSDN конкретно не говорится, что значение null является возможным возвратом. ценить:

Возвращаемое значение
Тип: System.Object
Экземпляр объекта, указанного в typeName.

Мой вопрос: Может ли AppDomain.CreateInstanceAndUnwrap законно вернуть null? Если да, то что бы это значило?


person Michael Liu    schedule 15.07.2013    source источник
comment
Есть ли шанс, что this.jobRunner аннулируется где-то посередине?   -  person M.A. Hanin    schedule 16.07.2013
comment
@ М.А.Ханин: Нет. Я пропустил только два утверждения: this.status = Status.RunningJob; Monitor.Exit(this.syncLock);   -  person Michael Liu    schedule 16.07.2013


Ответы (1)


Да, 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. И ответ: ДА, при определенных условиях он может возвращать значение null. Один из примеров, который я нашел, - это создание типов, допускающих значение NULL (см. этот SO вопрос), но я уверен, что есть и другие примеры.

person M.A. Hanin    schedule 16.07.2013
comment
Имеет смысл, что Activator.CreateInstance вернет null, когда его попросят построить Nullable<T>, но в моем случае указанный тип никогда не является Nullable<T>. - person Michael Liu; 16.07.2013
comment
Я понимаю. Я лично не знаю, почему в вашем случае в производственной системе возвращается null, но ответ на ваш вопрос - да - он может возвращать null. Чтобы диагностировать вашу ситуацию, я бы предложил обычные методы производственной отладки - ведение журнала, трассировку, производственные отладчики, такие как WinDbg и т. Д. В противном случае покажите нам еще код (например, класс JobRunner) - person M.A. Hanin; 17.07.2013
comment
@ М.А.Ханин Хороший ответ! Кстати, исходный код .NET Fx является общим. Вы можете скачать его со страницы referenceource.microsoft.com/netframework.aspx - person Panos Rontogiannis; 17.07.2013