2017-02-07 7 views
0

マスターページの<head>セクションにアセンブリバージョン情報を取得しようとしています。私はHTMLのセクションでそれを行う必要があります。これは私がnull参照の例外を取得する行です:アセンブリバージョン情報を取得しようとすると、完全な参照例外が発生する

<script src="/MyViewCore.js?v=<% Response.Write(System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).FileVersion.Replace(".", "")); %>" type="text/javascript"></script> 

孤立式は次のとおりです。

System.Diagnostics.FileVersionInfo.GetVersionInfo( 
    System.Reflection.Assembly.GetExecutingAssembly().Location 
) 
    .FileVersion 
    .Replace(".", ""); 

これが問題である理由を私は理解することはできません。

この問題を解決できますか?

+0

オブジェクトのどの部分がnullであるかを絞り込む必要があります。これは 'System.Reflection.Assembly.GetExecutingAssembly()'または '.FileVersion'です。ブレークポイントを使用してデバッグすることができます。 –

+0

コード集合 'GetExecutingAssembly()'は 'null'を返さずに' GetVersionInfo() 'を返し、オブジェクトを持っていてもそのプロパティはすべてオプションです。それは文化固有のバージョン情報を返すかもしれないことは言うまでもありません... –

答えて

1

FileVersionInfo.GetVersionInfoへのお電話は安全に行われません。

https://msdn.microsoft.com/en-us/library/system.diagnostics.fileversioninfo.getversioninfo(v=vs.110).aspx

GetVersionInfoのドキュメントは、それがFileVersionプロパティはnullになりますを意味し、任意のバージョン情報を読み取ることができませんでした場合は、「要求されたファイルの名前だけを」含むオブジェクトを返し述べています。

ファイルにバージョン情報が含まれていない場合、FileVersionInfoには要求されたファイルの名前のみが含まれます。あなたは速記<%=(または自動HTMLエンコーディングの<%:構文)を使用することができますので、あなたのコードが不必要に冗長でResponse.Writeを呼び出すことである

注意は不要です。 <%@ Import %>ディレクティブを使用して名前空間をインポートすることもできます。

C#6.0(Visual Studio 2015)を使用している場合は、ヌルセーフの演算子?.を使用することをお勧めします。ここで

は、私はそれを行うだろう方法は次のとおりです。私はあなたがそれはかなり読みやすくかつ保守だ同意するだろうと確信している

<%@ Import Namespace="System.Diagnostics" %> 
<%@ Import Namespace="System.Reflection" %> 
<% 
    String assembly = Assembly.GetExecutingAssembly().Location; 
    FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(assembly); 
    String version = versionInfo.FileVersion?.Replace(".", "") ?? "someFallbackValue"; 
%> 

... 

<script src="/MyViewCore.js?v=<%: version %>" type="text/javascript"></script> 

関連する問題