web-dev-qa-db-ja.com

フッターのアセンブリバージョンを取得できません

この質問 (選択された回答ではなく、[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を見ると、期待どおりにすべてがバージョン管理されています。しかし、フッターに表示するためにアクセスする方法がわかりません!!

30
Jaxidian

これは、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であると仮定します)

59
Dean Harding

人々が興味を持っているかもしれない別の解決策と同じように、私はこの問題を解決するためにこれらのヘルパーを作成しました:

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() %>
15
Jaxidian

あなたはできる:

たとえば、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。*まで

これはあなたにいくつかのバージョン管理を与えるでしょう

8
Moji

すでにGlobal.asaxを配置している場合は、バージョンをグローバルに一度保存するのに適した場所になる可能性があります。

Global.asax.cs:

public class Global : HttpApplication
{
    public static readonly Version Version = Assembly.GetExecutingAssembly().GetName().Version;
}

あなたの見解:

<div>- Version: @YourNamespace.Global.Version</div>
3
Clay