この質問 (選択された回答ではなく、[Assembly: AssemblyVersion("1.0.*")]
テクニックを使用した回答)で説明されている自動ビルドバージョン管理を使用しています。私はMVC2のSite.Masterファイルのフッターでこれを行っています。これを行うための私のコードは次のとおりです。
_<div id="footer">
<a href="emailto:[email protected]">[email protected]</a> - Copyright © 2005-<%= DateTime.Today.Year.ToString() %>, foo LLC. All Rights Reserved.
- Version: <%= Assembly.GetEntryAssembly().GetName().Version.ToString() %>
</div>
_
GetEntryAssembly()
はNULL
を返すため、私が得る例外は_Object reference not set to an instance of an object
_です。私の他のオプションも機能しません。 GetCallingAssembly()
は常に「4.0.0.0」を返し、GetExecutingAssembly()
は常に「0.0.0.0」を返します。 DLLを見ると、期待どおりにすべてがバージョン管理されています。しかし、フッターに表示するためにアクセスする方法がわかりません!!
これは、Assembly.GetEntryAssembly()
がnullを返しているためです:there is no "entry" Assembly in ASP.NET site(.NET Frameworkはw3wp.exeプロセスでホストされているため)。 Assembly.GetEntryAssembly()
は、起動した.exeアセンブリを取得するために使用されます(通常はコンソールまたはWindowsアプリケーションで)
Assembly.GetAssembly(this.GetType())
がバージョン「0.0.0.0」のアセンブリを返す理由は、ASP.NETがSite.Masterファイルを「ASP.NETTemporaryFiles」フォルダーの下の一時アセンブリにコンパイルするためです。 this
は、「生成された」クラスへの参照です。
Assembly.GetExecutingAssembly()
は基本的にAssembly.GetAssembly(this.GetType())
と同じです(ただし、「this」がない場合(静的メソッドなど)でも機能します)。
最善の方法は、目的のアセンブリに存在するタイプを明示的に使用することですknow。例として、「Site.Master」にアセンブリにコンパイルされたコードビハインドファイルがあると仮定します。代わりにそれを使用できます:
Assembly.GetAssembly(typeof(Site)).GetName().Version.ToString()
(クラスの名前がSite
であると仮定します)
人々が興味を持っているかもしれない別の解決策と同じように、私はこの問題を解決するためにこれらのヘルパーを作成しました:
public static class HtmlHelperExtensions
{
private static string _CachedCurrentVersionDate;
/// <summary>
/// Return the Current Version from the AssemblyInfo.cs file.
/// </summary>
public static string CurrentVersion(this HtmlHelper helper)
{
try
{
var version = Assembly.GetExecutingAssembly().GetName().Version;
return version.ToString();
}
catch
{
return "?.?.?.?";
}
}
public static string CurrentVersionDate(this HtmlHelper helper)
{
try
{
if (_CachedCurrentVersionDate == null)
{
// Ignores concurrency issues - assuming not locking this is faster than
// locking it, and we don't care if it's set twice to the same value.
var version = Assembly.GetExecutingAssembly().GetName().Version;
var ticksForDays = TimeSpan.TicksPerDay * version.Build; // days since 1 January 2000
var ticksForSeconds = TimeSpan.TicksPerSecond * 2 * version.Revision; // seconds since midnight, (multiply by 2 to get original)
_CachedCurrentVersionDate = new DateTime(2000, 1, 1).Add(new TimeSpan(ticksForDays + ticksForSeconds)).ToString();
}
return _CachedCurrentVersionDate;
}
catch
{
return "Unknown Version Date";
}
}
}
これにより、フッターで次のように消費できます。
Version: <%= Html.CurrentVersion() %> from <%= Html.CurrentVersionDate() %>
あなたはできる:
たとえば、Global.asaxファイルのApplication_Startメソッドに追加します
protected void Application_Start(object sender, EventArgs e)
{
HttpContext.Current.Application.Add("Version", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString());
}
hTMLで表示する
<div><% =HttpContext.Current.Application["Version"].ToString() %></div>
[〜#〜] also [〜#〜]次の場所に移動してアセンブリバージョンを1.0.0。*に変更します-プロジェクトプロパティ>アプリケーション>アセンブリ情報とアセンブリバージョンは1.0.0.0として表示されます-変更します1.0.0。*まで
これはあなたにいくつかのバージョン管理を与えるでしょう
すでにGlobal.asaxを配置している場合は、バージョンをグローバルに一度保存するのに適した場所になる可能性があります。
Global.asax.cs:
public class Global : HttpApplication
{
public static readonly Version Version = Assembly.GetExecutingAssembly().GetName().Version;
}
あなたの見解:
<div>- Version: @YourNamespace.Global.Version</div>