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?
Odpowiedz
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);
Crap. Jak zawsze dla mnie, to nie działa na Compact Framework. AssemblyName istnieje, ale AssemblyName.GetAssemblyName nie jest. – MusiGenesis
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. –
Czy masz próbkę kodu dla metody piaskownicy? – MusiGenesis
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.
Próbuję nie myśleć o wszystkich hackach, które wprowadziłem, próbując uzyskać numer wersji bez ładowania pliku. Yeesh. – MusiGenesis
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.
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ć. –
Wskazówka: Używanie FileVersionInfo żyje w przestrzeni nazw System.Diagnostics, którą należy zaimportować. –
@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 –
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);
W jakim języku piszesz? –
@RB: Język nie ma znaczenia, ponieważ można użyć tych samych klas, aby uzyskać informacje. –
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