Question

Comment puis-je savoir, à partir du nom de l'assembly, ou de la classe d'assembly (ou d'autres similaires), si un assembly fait partie du .FILET cadre (c'est-à-dire System.windows.Forms)?

Jusqu'à présent, j'ai considéré les propriétés PublicKeyToken et CodeBase, mais celles-ci ne sont pas toujours les mêmes pour l'ensemble du framework.

La raison pour laquelle je souhaite ces informations est d'obtenir une liste des assemblys que mon fichier EXE utilise et qui doivent se trouver sur les ordinateurs clients, afin que je puisse regrouper les fichiers corrects dans un fichier d'installation sans utiliser le système d'installation de Visual Studio.Le problème est que je ne souhaite pas récupérer d’assemblys de framework .NET et que je souhaite que ce soit un processus automatique facile à déployer chaque fois qu’une mise à jour majeure est terminée.

La solution ultime serait qu'il existe une propriété IsFramework...:)

Était-ce utile?

La solution

Je soupçonne que la méthode à la fois la plus fiable et la plus générale sera le PublicKeyToken.Oui, il y en a plus d’un, mais ce sera une liste limitée et qui ne changera pas très souvent.

D'ailleurs, vous pourriez simplement avoir une liste blanche de noms d'assemblys - cette liste sera également à la fois finie et statique entre les versions du framework.

Autres conseils

Pour ce faire, j'utilise le nom du produit intégré dans l'assembly via AssemblyProductAttribute.

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

J'utilise cette technique pour regrouper les assemblys par produit sous l'écran À propos de l'application et cela semble très bien fonctionner pour moi.

J'ai dû faire face exactement au même problème.Malheureusement, toutes les réponses données jusqu'à présent sont insuffisant pour déterminer en toute sécurité si un assembly fait partie du .NET Framework.

Microsoft met une classe nommée FXAssembly dans l'espace de noms global de chaque assembly de framework avec une chaîne const indiquant la version :

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

}

Utilisez ce "marqueur" pour vérifier si un assemblage est un assemblage de structure.Vérifier également la clé publique ne fera pas de mal non plus.

Non, cela ne commence pas par « Système ».Vous pouvez vérifier "WindowsBase" qui est un assemblage de framework.

Vous ne pouvez pas également vérifier le PublicKeyToken, car il existe d'autres assemblys Microsoft signés avec les clés « par défaut », mais ils ne font pas partie du .NET Framework (assemblys Visual Studio).

La meilleure façon de procéder est d'obtenir une collection de frameworks .NET installés et de vérifier si l'assembly cible fait partie de leur RedistList (RedistList\FrameworkList.xml).

FrameworkList.xml se trouve dans :

  • .NET 2.0 :C:\Windows\Microsoft.NET\Framework64\v2.0.50727 edistList
  • .NET 3.x :C:\Program Files (x86) eference Assemblyies\Microsoft\Framework\vNuméro de version\ListeRédiste
  • .NET 4.x :C:\Program Files (x86) eference Assemblyies\Microsoft\Framework.NETFramework\vNuméro de version\ListeRédiste
  • Noyau .NET :C:\Program Files (x86) eference Assemblyies\Microsoft\Framework.NETCore\vNuméro de version\ListeRédiste

Si vous savez qu'aucune de vos DLL ne sera dans le GAC, vous pouvez vérifier si chaque assembly est dans le GAC ou non.Si c'est le cas, ne le copiez pas.Si ce n'est pas le cas, copiez-le.Il existe une propriété sur la classe Assembly appelée GlobalAssemblyCache.Cela fonctionnerait évidemment mieux dans certaines situations que dans d’autres.

Lorsque vous installez Visual Studio, vous obtenez les assemblys de référence dans différents sous-dossiers du formulaire C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\{FrameworkName}\{FrameworkVersion} - la chose la plus intéressante pourrait être RedistList\FrameworkList.xml fichier qui contient une liste de tous les noms d’assembly fournis avec la version du framework donnée.

Par exemple. C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\RedistList\FrameworkList.xml semble contenir une liste de tous les assemblys Framework de .NET 4.0.

Vous pouvez facilement utiliser ces fichiers pour établir des listes blanches statiques d'assemblys.

Vous pouvez utiliser la réflexion pour examiner l'éditeur de l'assembly et le coordonner avec le chemin de l'assembly.Si vous trouvez un assembly dont l'éditeur est Microsoft, et qui existe quelque part en dessous C:\Windows\Microsoft.NET\Framework il y a fort à parier que cela fasse partie du runtime.

À la réflexion, l’éditeur n’est peut-être même pas nécessaire.Tout ce qui se trouve sous ce chemin devrait faire partie du moteur d'exécution (à l'exception d'une application qui se comporte mal et qui s'amuse là où elle ne devrait pas être).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top