2009-10-11 10 views
6

Podczas procesu tworzenia konfiguracji, Mam zamiar wykonać następujące czynności (w C# Script):Programowo zmienić AssemblyVersion i AssemblyFileVersion atrybuty

  1. Czytaj wartości atrybutów jednego DLL AssemblyVersion i AssemblyFileVersion.
  2. Powtórz wszystkie pliki DLL i pliki wykonywalne w projekcie i zastosuj te wersje do ich wartości atrybutów AssemblyVersion i AssemblyFileVersion.

Pytanie brzmi: Jak zrobić krok 2?

Pomyślnie mogę wykonać krok 1, ale dla etapu 2 nie widzę prawdziwego punktu początkowego. Prawdopodobnie muszę użyć pewnych natywnych metod P/Invoke, ponieważ atrybuty bezpośrednio modyfikują informacje o zasobach informacji o wersji pliku DLL/pliku wykonywalnego.

Jakieś wskazówki na ten temat?

Dzięki Uwe

Odpowiedz

13

Dlaczego nie, w trakcie procesu budowania przeczytać AssemblyVersion i AssemblyFileVersion jednego DLL i zapisać go z powrotem do innych csproject na AssemblyInfo.cs, dopiero potem skompilować?

W rzeczywistości nie wiem, czy można zmodyfikować plik DLL bezpośrednio, bez uciekania się do czegoś dziwnego.

Lub alternatywnie, upewnij się, że wszystkie twoje biblioteki DLL mają jeden wspólny AssemblyInfo.cs. Możesz to zrobić, dodając AssemblyInfo.cs jako "Dodaj jako łącze", gdy dodajesz nowy element w csproject. W ten sposób, gdy wykonasz kompilację, wszystkie biblioteki DLL będą miały ten sam numer AssemblyInfo.cs, a tym samym wypiszą ten sam plik AssemblyVersion.

+1

tak, że byłoby znacznie ** ** łatwiejsze! Ustaw numery wersji prosto w czasie kompilacji, np. korzystanie z serwera budowania ciągłej integracji –

+1

To byłaby właściwa droga, zmieniając skompilowane pliki, rozbijając czystą linię informacyjną między kodem a plikami binarnymi. –

+0

Dziękuję bardzo, podoba mi się pomysł udostępnienia pliku AssemblyInfo.cs! –

1

Jeśli masz dostęp do źródeł, podejmują advice from Graviton

Jeśli nie, to może być w tarapatach. Być może dezasemblujesz przy pomocy ILDASM i ponownie zestawisz z ILASM. Ale to nie zadziała w przypadku mocnych zestawów.

2

W moim przypadku utworzyłem szablon T4 do zmiany wartości AssemblyVersion i AssemblyFileVersion. Nazwałem szablon Assembly.tt i utworzyłem plik połączony (gdy go dodasz, wybierz Dodaj link, zamiast Dodaj). Wszystkie moje złożenia pobierają połączony plik Assembly.tt.

Następnie można uruchomić szablon T4 z jednego miejsca i zaktualizuje on wszystkie AssemblyVersion i AssemblyFileVersions. Nie musisz wywoływać pliku AssemblyInfo.cs, aby pobrać informacje do bibliotek dll.

Kod dla pliku Assembly.tt jest:

<#@ template language="C#" hostspecific="true" #> 
// 
// This code was generated by a tool. Any changes made manually will be lost 
// the next time this code is regenerated. 
// 

using System.Reflection; 

[assembly: AssemblyVersion("4.<#= this.RevisionYear #>.<#= this.RevisionNumber #>.<#= this.RevisionTime #>")] 
[assembly: AssemblyFileVersion("4.<#= this.RevisionYear #>.<#= this.RevisionNumber #>.<#= this.RevisionTime #>")] 
<#+ 
    int RevisionYear = DateTime.UtcNow.Year; 
    int RevisionNumber = (int)(DateTime.UtcNow - new DateTime(DateTime.UtcNow.Year,1,1)).TotalDays; 
    int RevisionTime = (int)(DateTime.UtcNow - new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day)).TotalMinutes; 
#> 

Wyjście szablonie T4 powyżej będą:

// 
// This code was generated by a tool. Any changes made manually will be lost 
// the next time this code is regenerated. 
// 

using System.Reflection; 

[assembly: AssemblyVersion("4.2016.284.1066")] 
[assembly: AssemblyFileVersion("4.2016.284.1066")]