Frage

Wie kann ich anhand des Assembly-Namens oder der Assembly-Klasse (oder einer ähnlichen Klasse) erkennen, ob eine Assembly Teil von ist? .NETZ Rahmen (d. h. System.windows.Forms)?

Bisher habe ich die Eigenschaften PublicKeyToken und CodeBase berücksichtigt, aber diese sind nicht immer für das gesamte Framework gleich.

Der Grund, warum ich diese Informationen möchte, besteht darin, eine Liste der Assemblys zu erhalten, die meine EXE-Datei verwendet und die auf Clientcomputern vorhanden sein müssen, damit ich die richtigen Dateien in eine Setup-Datei packen kann, ohne das Visual Studio-Setup-System zu verwenden.Das Problem besteht darin, dass ich keine .NET-Framework-Assemblys übernehmen möchte und dass es sich um einen automatischen Prozess handelt, der einfach auszurollen ist, wenn ein größeres Update abgeschlossen ist.

Die ultimative Lösung wäre, dass es eine IsFramework-Eigenschaft gibt ...:) :)

War es hilfreich?

Lösung

Ich vermute, dass die zuverlässigste und allgemeinste Methode das PublicKeyToken sein wird.Ja, es gibt mehr als eine, aber es wird eine begrenzte Liste sein, die sich nicht sehr oft ändert.

Im Übrigen könnten Sie einfach eine Whitelist mit Assemblynamen haben – auch diese Liste ist zwischen den Versionen des Frameworks sowohl endlich als auch statisch.

Andere Tipps

Um dies zu erreichen, verwende ich den Produktnamen, der über das AssemblyProductAttribute in die Assembly eingebettet ist.

var attribute = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0] as AssemblyProductAttribute;
var isFrameworkAssembly = (attribute.Product == "Microsoft® .NET Framework");

Ich verwende diese Technik, um Baugruppen im Info-Bildschirm der Anwendung nach Produkten zu gruppieren, und sie scheint für mich einwandfrei zu funktionieren.

Ich musste mich mit genau dem gleichen Problem befassen.Leider sind es alle bisher gegebenen Antworten unzureichend um sicher zu bestimmen, ob eine Assembly Teil des .NET Frameworks ist.

Microsoft legt eine Klasse mit dem Namen FXAssembly in den globalen Namespace jeder Framework-Assembly mit einer const-Zeichenfolge, die die Version angibt:

.class private abstract auto ansi sealed beforefieldinit FXAssembly
    extends [mscorlib]System.Object
{
    .field assembly static literal string Version = string('2.0.0.0')

}

Verwenden Sie diese „Markierung“, um zu überprüfen, ob es sich bei einer Baugruppe um eine Rahmenbaugruppe handelt.Auch die Überprüfung des öffentlichen Schlüssels kann nicht schaden.

Nein, es beginnt nicht mit „System“.Sie können „WindowsBase“ überprüfen, bei dem es sich um eine Framework-Assembly handelt.

Sie können auch das PublicKeyToken nicht überprüfen, da es andere Microsoft-Assemblys gibt, die mit den „Standard“-Schlüsseln signiert sind, diese jedoch nicht Teil des .NET Framework (Visual Studio-Assemblys) sind.

Der beste Weg, dies zu tun, besteht darin, eine Sammlung installierter .NET-Frameworks abzurufen und zu prüfen, ob die Zielassembly Teil ihrer RedistList ist (RedistList\FrameworkList.xml).

FrameworkList.xml finden Sie in:

  • .NET 2.0:C:\Windows\Microsoft.NET\Framework64\v2.0.50727 edistList
  • .NET 3.x:C:\Programme (x86) eference Assemblies\Microsoft\Framework\vVersionsnummer edistList
  • .NET 4.x:C:\Programme (x86) eference Assemblies\Microsoft\Framework.NETFramework\vVersionsnummer edistList
  • .NET Core:C:\Programme (x86) eference Assemblies\Microsoft\Framework.NETCore\vVersionsnummer edistList

Wenn Sie wissen, dass sich keine Ihrer DLLs im GAC befindet, können Sie prüfen, ob sich jede Assembly im GAC befindet oder nicht.Wenn ja, kopieren Sie es nicht.Wenn nicht, dann kopieren Sie es.Es gibt eine Eigenschaft in der Assembly-Klasse namens GlobalAssemblyCache.Dies würde offensichtlich in manchen Situationen besser funktionieren als in anderen.

Wenn Sie Visual Studio installieren, erhalten Sie die Referenzassemblys in verschiedenen Unterordnern des Formulars C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\{FrameworkName}\{FrameworkVersion} - Das Interessanteste könnte das sein RedistList\FrameworkList.xml Datei, die eine Liste aller Assemblynamen enthält, die mit der angegebenen Framework-Version ausgeliefert wurden.

Z.B. C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\RedistList\FrameworkList.xml scheint eine Liste aller Framework-Assemblys von .NET 4.0 zu enthalten.

Mit diesen Dateien können Sie problemlos statische Whitelists von Baugruppen erstellen.

Mithilfe von Reflection können Sie sich den Herausgeber der Assembly ansehen und diesen mit dem Pfad der Assembly koordinieren.Wenn Sie eine Assembly finden, deren Herausgeber Microsoft ist und die irgendwo unten existiert C:\Windows\Microsoft.NET\Framework Es ist mit Sicherheit Teil der Laufzeit.

Bei näherer Betrachtung ist der Herausgeber möglicherweise nicht einmal notwendig.Alles unter diesem Pfad sollte Teil der Laufzeit sein (mit Ausnahme einer sich schlecht verhaltenden Anwendung, die sich dort herumtreibt, wo sie nicht sein sollte).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top