10

XDocument をロードするための埋め込みリソースとして xml ファイルを使用しています。次のコードを使用して、アセンブリから適切なファイルを取得しています。

XDocument xd = new XDocument();
Assembly assembly = null;

try
{
    assembly = Assembly.GetExecutingAssembly();
}
catch(Exception ex)
{
    //Write exception to server event log
}

try
{
    if(assembly != null)
    {
        using(StreamReader sr = new 
            StreamReader(assembly.GetManifestResourceStream("assemblyPath")))
        {
            using(XmlTextReader xtr = new XmlTextReader(sr))
            {
                xd = XDocument.Load(xtr);
            }
        }
    }
}
catch(Exception ex)
{
    //Write exception to server event log
}

そのため、コードが展開されると、ときどきページに移動し、埋め込まれたドキュメントから何も読み込まれません。イベントログを確認すると、エラーはありません。ユーザーがページを更新するだけで、問題なく読み込まれます。これは、何らかの理由でassembly = Assembly.GetExecutingAssembly();時折 null を返していると考えるようになりました。コードの記述方法はエラーではありません。だから、私の質問は、なぜAssembly.GetExecutingAssembly();nullを返すのでしょうか? アンマネージ コードでエラーが発生することがあるという記事をいくつか見つけましたが、このアプリケーションは C# で記述され、セットアップ プロジェクトを介してデプロイされます。

このコードは、もともとエラー回避コードなしで書かれています。ユーザーにエラー画面が表示されないようにするために追加されました。例外は、サーバーのイベント ログに書き込まれます。

4

6 に答える 6

6

これは、例外、特にトップレベルの例外を食べることがほぼ普遍的に悪い考えである理由の完璧な例ですSystem.Exception。問題はどこにでもある可能性があります。ほとんどの場合、実際の問題はロギング コードにあります。

それらの空のcatchブロックを取り出し (または でそれらの内部を再スローしthrow;)、例外が実際に発生している場所を確認します。そして、実際の問題を見つけてコードを書き直したら、実際に処理方法を知っている例外だけをキャッチするようにコードを書き直します。

GetExecutingAssembly返品不可null、期間限定です。

于 2010-03-04T01:25:57.693 に答える
5

パスが指定されているファイルのプロパティに移動し、buildActionをデフォルトのコンテンツからEmbeddedResourceに変更します。再コンパイルすると、機能するはずです。

于 2011-11-16T11:05:53.577 に答える
3

管理されていないアプリケーション (NUnit テスト ランナーなど) からコードを起動している場合は、null が返されることがあります。コンソールを使用して次のことを試してください。

[Test]
public void att()
{
    Assert.NotNull(Assembly.GetExecutingAssembly());
}

埋め込みタグを付けたので、何らかのブートローダーまたはインタープリターを使用して .Net アプリを実行していると思いますか? これはおそらく管理されていない (つまり、.Net が解釈されていない) ため、null が返されます。

ドキュメントの「備考: http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly.aspx 」セクションを参照してください。

于 2014-03-13T00:47:48.900 に答える
1

これが理由の 1 つかもしれません - http://winterdom.com/2003/04/assemblygetexecutingassembly

于 2010-03-09T11:08:48.337 に答える
1

このような状況に直面したとき、返された値が null であることを実際に証明しようとします。これを試して:

try
{
    assembly = Assembly.GetExecutingAssembly();
    Log.Write("Executing assembly is null: " + (assembly == null))
}
catch(Exception ex)
{
    //Write exception to server event log
}

常に「false」と書かれていると思いますが、実際には別の何かが問題です-おそらくコードスニペットに含まれていないものです。

于 2010-03-04T01:24:41.677 に答える