2008-10-09 15 views
20

Jedna mała funkcja dużego programu sprawdza złożenia w folderze i zastępuje nieaktualne złożenia najnowszymi wersjami. Aby to osiągnąć, musi przeczytać numery wersji istniejących plików zespołu, bez faktycznego ładowania tych zespołów do procesu wykonywania.Jak uzyskać wersję zespołu bez jej ładowania?

+0

W jakim języku piszesz? –

+0

@RB: Język nie ma znaczenia, ponieważ można użyć tych samych klas, aby uzyskać informacje. –

+0

Musisz uczynić odpowiedź jop lub Joela właściwą. Chciałbym zagłosować na nich do miliona, gdybym mógł. Od lat chciałem wiedzieć, jak to robić. – MusiGenesis

Odpowiedz

32

Znalazłem następujące in this article.

using System.Reflection; 
using System.IO; 

... 

// Get current and updated assemblies 
AssemblyName currentAssemblyName = AssemblyName.GetAssemblyName(currentAssemblyPath); 
AssemblyName updatedAssemblyName = AssemblyName.GetAssemblyName(updatedAssemblyPath); 

// Compare both versions 
if (updatedAssemblyName.Version.CompareTo(currentAssemblyName.Version) <= 0) 
{ 
    // There's nothing to update 
    return; 
} 

// Update older version 
File.Copy(updatedAssemblyPath, currentAssemblyPath, true); 
+0

Crap. Jak zawsze dla mnie, to nie działa na Compact Framework. AssemblyName istnieje, ale AssemblyName.GetAssemblyName nie jest. – MusiGenesis

+0

Starszą sztuczką, której używałem (do skanowania za pomocą złożeń wtyczek), było utworzenie aplikacji domena piaskownicy, załadowanie jej w tym, a następnie zamknięcie aplikacji AppDomain, gdy skończyłem. Jednak nie jestem pewien co do CF. –

+0

Czy masz próbkę kodu dla metody piaskownicy? – MusiGenesis

9

Użyj AssemblyName.GetAssemblyName("assembly.dll");, a następnie zanalizuj nazwę. Zgodnie z MSDN:

To będzie działać tylko, jeśli plik zawiera manifest zespołu. Ta metoda powoduje otwarcie pliku i zamknięcie, ale zespół nie jest dodany do tej domeny.

+0

Próbuję nie myśleć o wszystkich hackach, które wprowadziłem, próbując uzyskać numer wersji bez ładowania pliku. Yeesh. – MusiGenesis

11

zależności od plików, jedna opcja może być FileVersionInfo - tj

FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(path) 
string ver = fvi.FileVersion; 

Problemem jest to, że to zależy od kodu posiadającego atrybut [AssemblyFileVersion], a dopasowanie atrybut [AssemblyVersion].

Myślę, że najpierw spojrzę na opcje AssemblyName sugerowane przez innych.

+1

Porównanie pliku FileVersionInfo w ten sposób również może być przydatne. Aktualizacja biblioteki, która naprawia błędy, ale nie zmienia interfejsu API, może mieć tę samą wersję zestawu, ale powinna mieć inną wersję pliku. Tak więc w wielu przypadkach AssemblyFileVersion może być tym, który chcesz sprawdzić. –

+0

Wskazówka: Używanie FileVersionInfo żyje w przestrzeni nazw System.Diagnostics, którą należy zaimportować. –

+0

@Jeżeli chcesz być sprawiedliwy, możesz po prostu nacisnąć ctrl +. (z naciskiem na nierozwiązany typ) i IDE go odnajdzie i doda go ...wtedy nie musisz zapamiętywać przestrzeni nazw –

0

Tylko dla przypomnienia: Oto jak uzyskać wersję pliku w C# .NET Compact Framework. Zasadniczo pochodzi z OpenNETCF, ale jest znacznie krótszy i ograniczony, dzięki czemu można go skopiować. Mam nadzieję, że pomoże ...

public static Version GetFileVersionCe(string fileName) 
{ 
    int handle = 0; 
    int length = GetFileVersionInfoSize(fileName, ref handle); 
    Version v = null; 
    if (length > 0) 
    { 
     IntPtr buffer = System.Runtime.InteropServices.Marshal.AllocHGlobal(length); 
     if (GetFileVersionInfo(fileName, handle, length, buffer)) 
     { 
      IntPtr fixedbuffer = IntPtr.Zero; 
      int fixedlen = 0; 
      if (VerQueryValue(buffer, "\\", ref fixedbuffer, ref fixedlen)) 
      { 
       byte[] fixedversioninfo = new byte[fixedlen]; 
       System.Runtime.InteropServices.Marshal.Copy(fixedbuffer, fixedversioninfo, 0, fixedlen); 
       v = new Version(
        BitConverter.ToInt16(fixedversioninfo, 10), 
        BitConverter.ToInt16(fixedversioninfo, 8), 
        BitConverter.ToInt16(fixedversioninfo, 14), 
        BitConverter.ToInt16(fixedversioninfo, 12)); 
      } 
     } 
     Marshal.FreeHGlobal(buffer); 
    } 
    return v; 
} 

[DllImport("coredll", EntryPoint = "GetFileVersionInfo", SetLastError = true)] 
private static extern bool GetFileVersionInfo(string filename, int handle, int len, IntPtr buffer); 
[DllImport("coredll", EntryPoint = "GetFileVersionInfoSize", SetLastError = true)] 
private static extern int GetFileVersionInfoSize(string filename, ref int handle); 
[DllImport("coredll", EntryPoint = "VerQueryValue", SetLastError = true)] 
private static extern bool VerQueryValue(IntPtr buffer, string subblock, ref IntPtr blockbuffer, ref int len); 
Powiązane problemy