2010-05-06 8 views
4

C cadre #/.netC Type # classe - Comment déterminer si elle est un cadre standard .net classe

Quel est le moyen le plus fiable pour déterminer si une classe (type) est une classe fournie par le .net cadre et pas n'importe laquelle de mes classes ou des classes de bibliothèque 3ème partie.

J'ai testé quelques approches

  • L'espace de noms, par exemple commençant par "Système".
  • Le Codebase de l'assemblée, où le dll est situé

Tout cela « sent » un peu maladroit mais cela fonctionne.

Question: Quelle est la manière la plus simple et la plus fiable de déterminer cela?

+1

Vous voudrez probablement commencer par définir ce que vous voulez dire par une classe de cadre «standard». Si vous pouvez réellement répondre à cela, le reste devrait être facile ... – Aaronaught

+0

J'ai ajouté un commentaire à ce sujet ci-dessous. Merci pour le pointage est sorti. – HorstWalter

Répondre

2

Lire l'Assemblée Société Attributs de l'ensemble [assemblage: AssemblyCompany ("Microsoft Corporation")]

http://msdn.microsoft.com/en-us/library/y1375e30.aspx

using System; 
using System.Reflection; 

[assembly: AssemblyTitle("CustAttrs1CS")] 
[assembly: AssemblyDescription("GetCustomAttributes() Demo")] 
[assembly: AssemblyCompany("Microsoft")] 

namespace CustAttrs1CS { 
    class DemoClass { 
     static void Main(string[] args) { 
      Type clsType = typeof(DemoClass); 
      // Get the Assembly type to access its metadata. 
      Assembly assy = clsType.Assembly; 

      // Iterate through the attributes for the assembly. 
      foreach(Attribute attr in Attribute.GetCustomAttributes(assy)) { 
       // Check for the AssemblyTitle attribute. 
       if (attr.GetType() == typeof(AssemblyTitleAttribute)) 
        Console.WriteLine("Assembly title is \"{0}\".", 
         ((AssemblyTitleAttribute)attr).Title); 

       // Check for the AssemblyDescription attribute. 
       else if (attr.GetType() == 
        typeof(AssemblyDescriptionAttribute)) 
        Console.WriteLine("Assembly description is \"{0}\".", 
         ((AssemblyDescriptionAttribute)attr).Description); 

       // Check for the AssemblyCompany attribute. 
       else if (attr.GetType() == typeof(AssemblyCompanyAttribute)) 
        Console.WriteLine("Assembly company is {0}.", 
         ((AssemblyCompanyAttribute)attr).Company); 
      } 
     } 
    } 
} 
+0

Merci, j'ai utilisé une combinaison de 1.) Le "Attribut de la Société" et 2.) "Strongname/jeton" répondre pour résoudre mes problèmes. J'apprécie vos commentaires. – HorstWalter

+0

Cela ne signifie pas que c'est la classe .NET Standart. Beaucoup de classes viennent avec .NET mais pas Standart. Et d'autres implémentation .NET comme Mono ont un autre nom de l'entreprise –

+0

Oui, vous avez raison. "Standard" signifiait quelque chose de spécifique dans mon contexte d'application, mais l '"attribut d'entreprise"/"réponse symbolique" a aidé à améliorer ma méthode de détection. Académiquement ma définition n'est pas précise/ambiguë. – HorstWalter

6

Vous pouvez vérifier jeton de clé publique de l'Assemblée. Les assemblys Microsoft (BCL) auront le jeton de clé publique b77a5c561934e089 ou b03f5f7f11d50a3a. Les assemblys WPF auront le jeton de clé publique 31bf3856ad364e35. En règle générale, pour obtenir le jeton de clé publique d'un assembly, vous pouvez utiliser sn.exe-Tp foo.dll. sn.exe fait partie du Windows SDK, que vous devriez déjà avoir.

Vous pouvez obtenir le jeton de clé publique du nom complet de l'ensemble (par exemple typeof(string).Assembly.FullName), qui est juste une chaîne, ou vous pouvez obtenir les octets de jeton de clé publique premières de l'Assemblée en faisant un P/Invoke dans StrongNameTokenFromAssembly.

+0

Merci, j'ai utilisé une combinaison de 1.) "L'attribut de la société" et 2."Strongname/token" answer pour résoudre mes problèmes. J'apprécie vos commentaires. – HorstWalter

0

Quelques idées:

Dans Visual Studio, dans Solution Explorer, développez Références, cliquez avec le bouton droit sur une référence, puis choisissez Propriétés et recherchez le chemin, exemple:
C: \ WINDOWS \ Microsoft.NET \ F ramework \ v2.0.50727 \ System.dll

Je suppose que la plupart des assemblys dans C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ sont susceptibles d'être standard .NET. En outre, vous pouvez rechercher l'assembly dans la bibliothèque MSDN, par exemple:
http://msdn.microsoft.com/en-us/library/system.aspx.

Questions connexes