¿Dónde entrarían los tipos de terceros? Es posible que desee diferenciar entre los tipos que dicen ser provistos por Microsoft y los que no.
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");
}
}
Por supuesto, cualquier tipo de reclamo podría a ser un complemento de Microsoft que se da este esquema, pero si lo que en realidad sólo va a llamar en sus propios tipos y los marcos, sospecho que esto debería funcionar bien .
Como alternativa, puede usar el token de clave pública del conjunto. Es probable que sea más difícil de falsificar. Confía en que Microsoft use una clave pública común para todas sus asambleas, y no lo hacen (de acuerdo con el comentario de Mehrdad más abajo). Sin embargo, podría adaptar fácilmente esta solución para un conjunto de claves públicas "esto es de Microsoft". Tal vez combinar los dos enfoques de alguna manera y reportar cualquier diferencia para una inspección adicional ...
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;
}
Un pequeño punto - pero podría ser ni su propio ni Microsoft ... –