2013-07-15 2 views
2

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

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

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

Однако MSDN Library конкретно не говорят, что нуль является возможное значение возврата:

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

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

+0

Любой шанс, что this.jobRunner сбрасывается где-то посередине? –

+0

@ M.A.Hanin: Нет. Я опустил только два утверждения: 'this.status = Status.RunningJob; Monitor.Exit (this.syncLock); ' –

ответ

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 при определенных условиях. Один из примеров, который я нашел, это создание типов с нулевым значением (см. this SO question), но я уверен, что есть другие примеры.

+0

Имеет смысл, что' Activator.CreateInstance' возвращает null, когда его попросят построить 'Nullable ', но в моем случае указанный тип никогда не является 'Nullable '. –

+0

Я понимаю. Я лично не знаю, почему null возвращается в вашем случае в производственной системе, но ответ на ваш вопрос - да - он может вернуть значение null. Чтобы диагностировать вашу ситуацию, я бы предложил обычные методы для отладки производства - протоколирование, отслеживание, производственные отладчики, такие как WinDbg и т. Д. В противном случае покажите нам еще один код (например, класс JobRunner) –

+0

@ M.A.Hanin. Хороший ответ! Кстати, источник .NET Fx является общим. Вы можете скачать его с http://referencesource.microsoft.com/netframework.aspx –

Смежные вопросы