2013-07-15 4 views
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)이 가능한 반환 값라고하지 않습니다 스택 추적에 행 번호를 신뢰할 수 있다면, AppDomain.CreateInstanceAndUnwrap가 null을 반환 것을 나타내는 것 같다

반환 값
유형 :은 System.Object
유형 이름로 지정된 객체의 인스턴스입니다.

내 질문 :AppDomain.CreateInstanceAndUnwrap 합법적으로 null을 반환 할 수 있나요? 그렇다면 그게 무슨 뜻일까요?

+0

this.jobRunner가 그 사이 어딘가에서 무효화 될 가능성이 있습니까? –

+0

@ M.A.Hanin : 아니요. 저는 두 문장만을 생략했습니다 :'this.status = Status.RunningJob; Monitor.Exit (this.syncLock);' –

답변

3

예, AppDomain.CreateInstanceAndUnwrap은 합법적으로 null을 반환 할 수 있습니다.

[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을 반환 할 수 있습니다 여기에

은 (.NET 리플렉터를 사용)하는 방법에 대한 반사 된 코드입니다. 그리고 대답은 입니다, 그것은 특정 조건에서 null을 반환 할 수 있습니다. 내가 찾은 한 가지 예는 nullable 형식을 만드는 것입니다 ( this SO question 참조). 그러나 다른 예제가있을 것입니다.

+0

'Activator.CreateInstance'는'Nullable '을 생성하라는 요청을 받았을 때 null을 리턴하지만, 제 경우에는 지정된 타입이 결코 Nullable 이 아닙니다. –

+0

나는 이해한다. 개인적으로 프로덕션 시스템에서 null이 반환되는 이유를 알 수는 없지만 질문에 대한 대답은 예입니다. null을 반환 할 수 있습니다. 귀하의 상황을 진단하려면 생산 디버깅 (예 : 로깅, 추적, WinDbg과 같은 프로덕션 디버거 등)에 대한 일반적인 기술을 제안하십시오. 그렇지 않으면 JobRunner 클래스와 같은 코드를 더 보여주십시오 –

+0

@ M.A.Hanin 좋은 답변입니다! 그런데 .NET Fx 소스가 공유됩니다. http://referencesource.microsoft.com/netframework.aspx에서 다운로드 할 수 있습니다. –

관련 문제