Eine kleine Funktion eines großen Programms untersucht Baugruppen in einem Ordner und ersetzt veraltete Baugruppen durch die neuesten Versionen. Zu diesem Zweck muss es die Versionsnummern der vorhandenen Assemblydateien lesen, ohne diese Assemblys tatsächlich in den ausführenden Prozess zu laden.Wie bekomme ich die Version einer Assembly, ohne sie zu laden?
Antwort
Ich fand folgende 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);
Mist. Wie immer für mich funktioniert dies nicht auf dem Compact Framework. AssemblyName ist vorhanden, AssemblyName.GetAssemblyName jedoch nicht. – MusiGenesis
Ein älterer Trick, den ich verwendet habe (zum Durchsuchen von Plug-in-Assemblys), war, eine Sandbox-AppDomain zu erstellen, sie dort zu laden und dann die AppDomain zu schließen, wenn ich fertig war. Nicht sicher über CF. –
Haben Sie ein Codebeispiel für den Sandbox-Ansatz? – MusiGenesis
Verwenden Sie AssemblyName.GetAssemblyName("assembly.dll");
, dann analysieren Sie den Namen. Nach MSDN:
Dies nur, wenn die Datei Manifest enthält eine Baugruppe arbeiten. Diese Methode bewirkt, dass die Datei geöffnet und geschlossen wird, aber die Assembly ist nicht dieser Domäne hinzugefügt.
Ich versuche nicht an all die Hacks zu denken, die ich implementiert habe, um eine Versionsnummer zu bekommen, ohne die Datei zu laden. Ja, – MusiGenesis
Abhängig von den Dateien, könnte eine Option FileVersionInfo
sein - das heißt
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(path)
string ver = fvi.FileVersion;
Das Problem ist, dass diese auf dem Code hängt das [AssemblyFileVersion]
Attribut, und es das [AssemblyVersion]
Attribut entspricht.
Ich denke, ich würde zuerst die AssemblyName-Optionen betrachten, die von anderen vorgeschlagen werden.
Ein Vergleich der FileVersionInfo könnte ebenfalls nützlich sein. Ein Update für eine Bibliothek, das Fehler behebt, aber die API nicht ändert, könnte die gleiche Assembly-Version haben, sollte aber eine andere Dateiversion haben. In vielen Fällen kann die AssemblyFileVersion die zu überprüfende sein. –
Tipp: Die Verwendung von FileVersionInfo befindet sich im System.Diagnostics-Namespace, den Sie importieren müssten. –
@eithe, um fair zu sein, können Sie nur Strg + drücken. (mit dem Schwerpunkt auf einem unaufgelösten Typ) und die IDE wird es finden und für Sie hinzufügen ...dann müssen Sie sich Namespaces nicht merken –
Nur für den Rekord: So erhalten Sie die Dateiversion in C# .NET Compact Framework. Es ist im Grunde von OpenNETCF, aber sehr viel kürzer und exakter, so dass es kopiert werden kann. Hoffe, dass es helfen wird ...
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);
- 1. WCF-Erweiterungen ohne die Assembly-Version
- 2. Assembly versucht, falsche Assembly-Version zu lösen
- 3. Wie kann ich die Version einer Assembly in C# abrufen?
- 4. Laden Sie ein ResourceDictionary aus einer Assembly
- 5. Fresko. Wie bekomme ich Bildgröße, ohne volle Bitmap zu laden?
- 6. C# Wie bekomme ich dll Assembly Informationen?
- 7. wie die Assembly-Manifest ohne Laden der DLL
- 8. Warum bekomme ich manchmal "Konnte Datei oder Assembly AjaxControlToolkit Version 3.0 nicht laden"?
- 9. Wie bekomme ich die Apache-Version
- 10. Wie bekomme ich Assembly Version (nicht File Version) für eine andere EXE?
- 11. Wie finde ich die Assembly Version des aufrufenden Programms?
- 12. Wie bekomme ich die Version von einer Gemspec-Datei?
- 13. Wie bekomme ich die jQuery-UI-Version?
- 14. Wie bekomme ich die Assembly-Version eines anderen Projekts von app.config?
- 15. Wie kann ich meiner ASP.NET-Anwendung mitteilen, eine beliebige Version einer stark benannten Assembly zu verwenden?
- 16. Wie bekomme ich die CSS-Version
- 17. Wie bekomme ich Server MySQL Version in PHP ohne Verbindung?
- 18. Wie bekomme ich die rohe Version eines Git von Github?
- 19. Konnte Datei oder Assembly 'log4net nicht laden, Version = 1.2.10.0
- 20. Wie bekomme ich die Assembly-Version von meinem SLN in einen Continuous Integration Labeler?
- 21. Wie funktioniert die Assembly-Version genau?
- 22. Wie bekomme ich nur einen Schlüssel - ohne die Entität zu laden - von ReferenceProperty in GAE?
- 23. Wie kann ich die Assembly-Version einer .NET Assembly in Windows Vista und neuer (Windows 7, 2008) sehen?
- 24. UITableView Laden Sie mehr, ohne die Tabelle neu zu laden
- 25. Fehler: Konnte Datei oder Assembly nicht laden 'Microsoft.SqlServer.Management.Sdk.Sfc, Version = 11.0.0.0'
- 26. Wie bekomme ich die Version des installierten Minifiltertreibers?
- 27. Wie bekomme ich Python zur Verwendung Assembly
- 28. FileNotFound beim Laden Assembly mit Abhängigkeit zu einer anderen Domäne
- 29. Kann Datei oder Assembly 'crystal decisions.windows.forms nicht laden, Version = 13.0.2000.0'
- 30. Assembly Version von AssemblyInfo.cs
In welcher Sprache codierst du? –
@RB: Sprache spielt keine Rolle, weil man die gleichen Klassen verwenden würde, um die Informationen zu erhalten. –
Sie müssen Jop's oder Joels Antwort die richtige Antwort geben. Ich würde sie bis zu einer Million stimmen, wenn ich könnte. Ich wollte schon seit Jahren wissen, wie das geht. – MusiGenesis