2008-11-27 2 views
23

У меня есть веб-приложение asp.net, в котором есть несколько версий, развернутых на разных серверах клиентов внутри их сетей. Одна из практических задач, которую мы имеем, заключается в том, чтобы иметь клиентские скриншоты электронной почты, когда у них есть проблемы.ASP.NET - показать дату сборки/информацию в нижней части экрана

В старом asp.net 1.1 дня мы могли бы получить детали DLL сборки, используя отражение и показать информацию о дате сборки и нумерации на экране в тонком месте.

С .NET 2.0 и выше модель сборки изменилась, и этот механизм больше не работает. Я слышал о различных системах сборки там, но я действительно ищу простейший путь, в рамках 3.5, чтобы сделать то, что эта функциональность сделала на платформе 1.1.

  1. Каждый раз, когда выполняется сборка, обновлять дату сборки/время, и каким-то образом изменить номер сборки
  2. Уметь увидеть сборки временную метку и номер, чтобы отобразить на экране
  3. быть как простой реализовать как можно
+0

http://stackoverflow.com/questions/1168279/asp-net-version-build-number/1168329#1168329 – Saber

ответ

17

Мы используем .Net 2.0 и извлекать информацию о версии из сборки. Возможно, это не идеально, но мы используем описание для хранения даты сборки.

Assembly assembly = Assembly.GetExecutingAssembly(); 
string version = assembly.GetName().Version.ToString(); 
string buildDate = ((AssemblyDescriptionAttribute)Attribute.GetCustomAttribute(
    assembly, typeof(AssemblyDescriptionAttribute))).Description; 

В процессе сборки используется asminfonant task для создания файла AssemblyInfo.cs, который содержит эту информацию.

<asminfo output="Properties\AssemblyInfo.cs" language="CSharp"> 
     <imports> 
      <import namespace="System" /> 
      <import namespace="System.Reflection" /> 
      <import namespace="System.Runtime.CompilerServices" /> 
      <import namespace="System.Runtime.InteropServices" /> 
     </imports> 
     <attributes> 
      <attribute type="AssemblyVersionAttribute" value="${assembly.version}" /> 
      <attribute type="AssemblyInformationalVersionAttribute" value="${assembly.version}" /> 
      <attribute type="AssemblyDescriptionAttribute" value="${datetime::now()}" /> 
      ... 
     </attributes> 
    </asminfo> 
+0

Это именно тот тип решения, которое я искал. Хорошая форма. – pearcewg

+1

У меня был код, очень похожий на это, я вложил его в настраиваемый элемент управления, чтобы вы могли просто перетащить его в: –

7

Вы можете получить дату Ассамблеи сборки через отражение, проверить это примеры:

+1

«Определение Конструктивный нелегкий путь» работает для меня. – zsong

+0

Приятная находка с решением Coding Horror - мне определенно не нравится решение по умолчанию, которое зависит от версии сборки после major.minor. *.0, так как я всегда устанавливал версию сборки на major.minor.0.0 и версию файла сборки на major.minor.build.revision, чтобы я мог легко собирать сборки. Чтение собственной метки линкера очень хитрое. + 1 со всех сторон! –

16

Я использую .NET 2.0 и 3.5, и он может устанавливать как номер сборки, так и дату сборки. В то время как панель справки говорит, что, если она еще не установила .NET, она будет использовать случайное число для пересмотра, что неверно, оно фактически позволяет легко получить информацию о дате/времени, что подтверждается онлайн-документами : http://msdn.microsoft.com/en-us/library/system.reflection.assemblyversionattribute.assemblyversionattribute.aspx

Смотрите этот блог: http://dotnetfreak.co.uk/blog/archive/2004/07/08/determining-the-build-date-of-an-assembly.aspx?CommentPosted=true#commentmessage

Я хочу, чтобы установить версию сборки самостоятельно, но все еще хотите, автоматический штамп даты/времени, поэтому я использую что-то вроде этого для AssemblyVersion («1,0 *.»)

Вот пример функции для извлечения даты и времени сборки

private System.DateTime BuildDate() 
{ 

//This ONLY works if the assembly was built using VS.NET and the assembly version attribute is set to something like the below. The asterisk (*) is the important part, as if present, VS.NET generates both the build and revision numbers automatically. 
//<Assembly: AssemblyVersion("1.0.*")> 
//Note for app the version is set by opening the 'My Project' file and clicking on the 'assembly information' button. 
//An alternative method is to simply read the last time the file was written, using something similar to: 
//Return System.IO.File.GetLastWriteTime(System.Reflection.Assembly.GetExecutingAssembly.Location) 

//Build dates start from 01/01/2000 

System.DateTime result = DateTime.Parse("1/1/2000"); 

//Retrieve the version information from the assembly from which this code is being executed 

System.Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; 

//Add the number of days (build) 

result = result.AddDays(version.Build); 

//Add the number of seconds since midnight (revision) multiplied by 2 

result = result.AddSeconds(version.Revision * 2); 

//If we're currently in daylight saving time add an extra hour 

if (TimeZone.IsDaylightSavingTime(System.DateTime.Now, TimeZone.CurrentTimeZone.GetDaylightChanges(System.DateTime.Now.Year))) 
{ 
    result = result.AddHours(1); 
} 

return result; 

} 
+0

Это очень полезно и не требует ничего, кроме одного быстрого изменения в AssemblyInfo .cs! :-) – Filip

33

Я решил использовать только дату выполнения сборки. Способ публикации файлов, это прекрасно работает.

lblVersion.Text = String.Format("Version: {0}<br>Dated: {1}", 
    System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(), 
    System.IO.File.GetLastWriteTime(System.Reflection.Assembly.GetExecutingAssembly().Location).ToShortDateString()); 
+0

Я использую инкрементный номер сборки, поэтому я не могу использовать какое-либо из этого «количества секунд»-фиолетовой магии, которое некоторые сообщения используют с номерами версий. –