0

これは、私がしばらく前に尋ねたこの質問の続きです。

Assembly.GetExecutingAssembly() のパフォーマンス

このソリューションは完璧に思えました。今、私はそれを実装することに取り掛かりましたが、うまくいきません。内部例外はSystem.TypeInitializationException古き良きものObject reference not set to an instance of an objectです。なぜそれが機能しないのか、今ではわかりません。私の推測ではstatic readonly、Assembly クラスなどの前にプロパティがインスタンス化されているのでしょうか?

なぜこれが起こっているのか、誰でも光を当てることができますか?これは明らかなので readonly を使用しない以外の修正も歓迎されますが、必ずしも期待されているわけではありません!

コードは次のとおりです。

public class VersionHelper
    {
        private static readonly Version _applicationVersion = Assembly.GetEntryAssembly().GetName().Version;
        public static string GetVersionText()
        {
            return string.Format("Version: {0}-{1}", _applicationVersion, Environment.MachineName.Substring(5));
        }
    }

呼ばれる:

protected void Page_Load(object sender, EventArgs e)
{
    lblVersion.Text = VersionHelper.GetVersionText();
}

このようにするとうまくいくかどうかを説明するだけです:

public class VersionHelper
    {
        public static string GetVersionText()
        {
            Assembly web = Assembly.GetExecutingAssembly();
            AssemblyName webName = web.GetName();
            return string.Format("Version: {0}-{1}", webName.Version, Environment.MachineName.Substring(5));
        }
    }
4

2 に答える 2

2

この例外は、プロパティが読み取り専用かどうかとは関係ありません。問題は、ASP.NET コンテキストで Assembly.GetEntryAssembly() を呼び出していることであり、明らかにうまく連携していません。

あなたが持っている他のオプションもこのメソッドを使用せず、Assembly.GetExecutingAssembly を使用します。Assembly.GetExecutingAssembly を使用するように最初のサンプルを変更すると、問題なく動作することがわかります。

実際の参照はありませんが、この質問、特に質問の下のコメントを確認できます。

また、ASP.NET コンテキストでエントリ アセンブリを取得する方法に関するソリューションも含まれています。

于 2012-10-19T11:06:09.143 に答える
-1

Assembly.GetEntryAssembly具体的には、アプリケーションがマネージド コンテキストではなくアンマネージド コンテキストで開始された場合、NULL を返します。結果は null チェックする必要があります。

たとえば、アンマネージ アプリケーションが C# で記述された COM コンポーネントのインスタンスを作成する場合GetEntryAssembly、プロセスのエントリ ポイントがマネージ アセンブリではなくアンマネージ コードであるため、C# コンポーネントからメソッドを呼び出すと NULL が返されます。

一方、GetExecutingAssembly現在実行中のコードを含むアセンブリを取得するだけです。

while 現在実行中のコードを呼び出したメソッドを含むアセンブリを取得するには、 を使用する必要がありますGetCallingAssembly

于 2012-10-19T10:45:26.337 に答える