L'unico modo per sicurezza controllare se un tipo fa parte di un assembly è controllare il nome completo dell'assembly che contiene il suo nome, versione, cultura e chiave pubblica (se firmato). Tutte le librerie di classi di base .Net (BCL) sono firmate da Microsoft utilizzando le loro chiavi private. Ciò rende quasi impossibile per chiunque altro creare un assembly con lo stesso nome completo di una libreria di classi base.
//add more .Net BCL names as necessary
var systemNames = new HashSet<string>
{
"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
"System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
};
var isSystemType = systemNames.Contains(objToTest.GetType().Assembly.FullName);
una soluzione leggermente meno fragile è utilizzare la classe AssemblyName e ignorare il controllo versione/cultura. Questo ovviamente presuppone che la chiave pubblica non cambi tra le versioni.
//add more .Net BCL names as necessary
var systemNames = new List<AssemblyName>
{
new AssemblyName ("mscorlib, Version=4.0.0.0, Culture=neutral, " +
"PublicKeyToken=b77a5c561934e089"),
new AssemblyName ("System.Core, Version=4.0.0.0, Culture=neutral, "+
"PublicKeyToken=b77a5c561934e089")
};
var obj = GetObjectToTest();
var objAN = new AssemblyName(obj.GetType().Assembly.FullName);
bool isSystemType = systemNames.Any(
n => n.Name == objAN.Name
&& n.GetPublicKeyToken().SequenceEqual(objAN.GetPublicKeyToken()));
La maggior parte dei BCL è stata firmata con la stessa chiave ma non tutti. È possibile utilizzare la classe AssemblyName per controllare semplicemente il token della chiave pubblica. Dipende dai tuoi bisogni.
fonte
2010-07-04 23:42:13
Perché ti interessa? –