2017-08-10 4 views
3

Ich versuche herauszufinden, wenn eine Assembly geändert wurde (auch wenn die Versionsnummer identisch ist).Wie bekomme ich C# .NET Compiler Assembly GUID

Der beste Versuch für jetzt ist herauszufinden, es wurde neu kompiliert, daher möchte ich das gleiche Element verwenden, das MSBuild verwendet, die ich glaube, ist die Dateien GUID in Metadaten gespeichert? (Wie per The .NET File Format)

Gibt es eine Möglichkeit, wie ich auf diese Informationen zugreifen kann, ohne das Rad neu zu erfinden und auf Dateibytes herunterzufallen?

+1

Nützlich https://stackoverflow.com/questions/502303/how-do-i-programmatically-get-the-guid-of-an-application-in-net2-0? – DavidG

+0

Hmm, nein, der [Guid] ist nutzlos. Die MVID könnte nützlich sein, der Compiler muss beim Erstellen der Assembly eine neue generieren. Nichts davon sagt Ihnen jemals, dass sich die Assembly tatsächlich geändert hat, nur dass die Datei neu erstellt wurde. Etwas, das das Dateidatum bereits sagt. –

+0

@HansPassant Problem mit dem Datum der Datei ist, wenn Sie eine dumme Kopie verwenden, die nicht geändert Datum, dann verlieren Sie diese Tatsache, nicht das größte Problem in der Welt, aber wird der Fall sein, wenn ich nicht verwenden kann Das gleiche, was MSBuild verwendet. –

Antwort

0

Versuchen Sie, in einem variablen Datum der letzten Änderung der Baugruppe zu speichern und überprüfen Sie es. Hier ist, wie Datum der letzten Änderung einer Baugruppe zu erhalten:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); 
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location); 
DateTime lastModified = fileInfo.LastWriteTime; 
+0

Ich muss möglicherweise auf das letzte Änderungsdatum zurückfallen. –

1

Nun, es scheint, dass Baugruppen nicht dazugehörigen GUIDs haben. Module, Klassen, Methoden, Felder haben GUIDs, und der "GUID" -Stream in einer Assembly ist ein Ort, um sie zu speichern.

Wenn Sie auf Meta-Informationen einer Baugruppe (z. B. GUID des Hauptmoduls) zugreifen möchten, ist Mono.Cecil möglicherweise eine gute Option.

Stattdessen können Sie dies erreichen, indem Sie eine Prüfsumme mit einer Hash-Funktion berechnen oder sich nur das Änderungsdatum ansehen. System.IO.FilesystemWatcher kann Sie informieren, wenn Sie nicht intervallisch auf die Datei zugreifen möchten.

+0

wow danke! das Mono.Cecil sieht interessant aus, wird das überprüfen. –

Verwandte Themen