Où les types tiers devraient-ils entrer? Vous pouvez faire la différence entre les types qui prétendent être fournis par Microsoft et les types qui ne le sont pas.
using System;
using System.Linq;
using System.Reflection;
class Test
{
static void Main()
{
Console.WriteLine(IsMicrosoftType(typeof(string)));
Console.WriteLine(IsMicrosoftType(typeof(Test)));
}
static bool IsMicrosoftType(Type type)
{
object[] attrs = type.Assembly.GetCustomAttributes
(typeof(AssemblyCompanyAttribute), false);
return attrs.OfType<AssemblyCompanyAttribute>()
.Any(attr => attr.Company == "Microsoft Corporation");
}
}
Bien sûr, tout type pourrait réclamation être un Microsoft un donné ce schéma, mais si vous êtes en train de ne va l'appeler sur vos propres types et les cadres, je soupçonne que cela fonctionne bien .
Vous pouvez également utiliser le jeton de clé publique de l'assembly. Cela risque d'être plus difficile à simuler. Il s'appuie sur Microsoft en utilisant une clé publique commune pour tous leurs assemblages, ce qu'ils ne font pas (selon le commentaire de Mehrdad ci-dessous). Cependant, vous pouvez facilement adapter cette solution pour un défini des clés publiques acceptées "ceci vient de Microsoft". combiner Peut-être les deux approches en quelque sorte et signaler les différences pour une inspection plus poussée ...
static bool IsMicrosoftType(Type type)
{
AssemblyName name = type.Assembly.GetName();
byte[] publicKeyToken = name.GetPublicKeyToken();
return publicKeyToken != null
&& publicKeyToken.Length == 8
&& publicKeyToken[0] == 0xb7
&& publicKeyToken[1] == 0x7a
&& publicKeyToken[2] == 0x5c
&& publicKeyToken[3] == 0x56
&& publicKeyToken[4] == 0x19
&& publicKeyToken[5] == 0x34
&& publicKeyToken[6] == 0xe0
&& publicKeyToken[7] == 0x89;
}
point mineur - mais il ne peut être ni votre propre ni Microsoft ... –