2

NullReferenceException実稼働システムで発生している問題をトラブルシューティングしようとしています。スタック トレースの行番号が信頼できる場合、AppDomain.CreateInstanceAndUnwrapnull が返されたことを示しているように見えます。

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 を返すことはできますか? もしそうなら、それはどういう意味ですか?

4

1 に答える 1

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 を返すことができるかどうかです。答えはYESです。特定の条件で null を返すことができます。私が見つけた1つの例は、null許容型の作成です(このSOの質問を参照)が、他の例があると確信しています。

于 2013-07-16T09:36:26.140 に答える