2013-07-15 63 views
2

我正試圖解決在生產系統上發生的NullReferenceException問題。如果在堆棧跟蹤的行號是可以信任的,那就似乎表明AppDomain.CreateInstanceAndUnwrap返回null: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

this.jobRunner在兩者之間的任何地方都被取消了嗎? –

+0

@ M.A.Hanin:不,我只省略了兩條語句:'this.status = Status.RunningJob; Monitor.Exit(this.syncLock);' –

回答

3

是的,AppDomain.CreateInstanceAndUnwrap可以合法返回null。

下面是該方法的體現代碼(使用.NET反射鏡):

[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。我發現的一個例子是創建可空類型(請參閱this SO question),但我相信還有其他例子。

+0

當要求構造'Nullable '時,'Activator.CreateInstance'將返回null,但在我的情況下,指定的類型永遠不會是'Nullable '。 –

+0

我明白了。我個人不知道爲什麼null會在生產系統中返回,但是您的問題的答案是肯定的 - 它可以返回null。爲了診斷你的情況,我建議通常的生產調試技術 - 記錄,跟蹤,生產調試器,如WinDbg等,否則,向我們展示更多代碼(如JobRunner類) –

+0

@ M.A.Hanin好的答案!順便說一下,.NET Fx源代碼是共享的。您可以從http://referencesource.microsoft.com/netframework.aspx下載它 –

相關問題