2010-05-12 33 views
29

我用了this question提到的自動構建版本(而不是選擇答案,但使用該[assembly: AssemblyVersion("1.0.*")]技術答案)獲取程序集版本。我在我的Site.Master文件的頁腳MVC 2這樣做是如下這樣我的代碼:無法爲頁腳

<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> 

我得到的例外是Object reference not set to an instance of an object因爲GetEntryAssembly()回報NULL。我的其他選項也不起作用。 GetCallingAssembly()總是返回「4.0.0.0」,GetExecutingAssembly()總是返回「0.0.0.0」。當我去看我的DLL時,所有的東西都是我所期望的版本。但我不知道如何訪問它來顯示在我的頁腳!

+0

'Assembly.GetAssembl Y(this.GetType())。的GetName()。Version.ToString()'也返回 「0.0.0.0」 – Jaxidian 2010-05-12 00:20:11

+0

GetEntryAssembly()也可以返回null當組件從非託管代碼稱爲 http://msdn.microsoft .com/en-us/library/system.reflection.assembly.getentryassembly.aspx – GenEric35 2010-05-12 00:52:01

+0

和w3wp.exe實際上是非託管的,模塊'w3wp.exe'不包含CLI標頭 – GenEric35 2010-05-12 00:59:54

回答

56

這是因爲Assembly.GetEntryAssembly()將返回NULL:有沒有「進入」裝配在ASP.NET網站(因爲.NET框架已經在W3wp.exe進程託管)。 Assembly.GetEntryAssembly()用於獲取從(通常在控制檯或Windows應用程序中)啓動的.exe程序集

原因Assembly.GetAssembly(this.GetType())返回的程序集版本爲「0.0.0.0」是因爲ASP.NET編譯了您的Site.Master文件轉換爲您的「ASP.NET Temporary Files」文件夾下的臨時程序集。 this是對「生成」類的引用。

Assembly.GetExecutingAssembly()基本上一樣Assembly.GetAssembly(this.GetType())(除非它也可以在沒有「本」(例如,在靜態方法)。

最好的辦法是使用顯式使用類型,你知道存在於你裝配後作爲一個例子,我想你「的Site.Master」有一個代碼隱藏文件編譯成彙編您可以使用來代替:。

Assembly.GetAssembly(typeof(Site)).GetName().Version.ToString() 

(假設該班的名字是Site

+10

這可行!有趣的是,我通過創建一個帶有Assembly.GetExecutingAssembly()調用的HtmlHelper擴展來執行一個小測試。<%= Assembly.GetAssembly(typeof(HomeController))。GetName()。Version.ToString()%>' – Jaxidian 2010-05-12 00:48:48

+0

我可以從我的Site.Master調用它,它工作得很好!對我來說,這實際上令人驚訝,因爲我修改了我的csproj文件以編譯我的視圖。我誤解了這個設置的作用?我認爲,刪除了所有的臨時議會和什麼? – Jaxidian 2010-05-12 01:06:43

+1

視圖總是被編譯的,不同之處在於您可以一次編譯一切,也可以在首次訪問站點時按需編譯它們。無論哪種方式,它們仍將被編譯到單獨的DLL中。 – 2010-05-12 01:09:39

15

正如另一種解決方案,人們可​​能感興趣的,我已經炮製這些助手來幫助解決這個問題:

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() %> 
+1

由於夏令時的調整未在時間計算中考慮。 – 2014-10-02 00:04:59

3

如果你已經有Global.asax,它可能是一個全球存儲版本的好地方。

的Global.asax.cs:

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

您的看法:

<div>- Version: @YourNamespace.Global.Version</div> 
+0

不幸的是,這是不可測試的。 – abatishchev 2013-05-26 19:58:42

8

您可以:

e.g在全球的Application_Start方法中。ASAX文件由

<div><% =HttpContext.Current.Application["Version"].ToString() %></div> 

ALSO變化大會版本添加

protected void Application_Start(object sender, EventArgs e) 
{ 
    HttpContext.Current.Application.Add("Version", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); 
} 
在HTML

拿給1.0.0 *前往 - 項目屬性>應用程序>裝配信息和裝配版本顯示爲1.0.0.0 - 將其更改爲1.0.0 *

這會給你一些版本號

+0

雖然這可以通過添加各種技巧/複雜性來測試。 – abatishchev 2013-05-26 19:59:15