2009-09-11 20 views
24

Me gustaría analizar un nombre calificado de ensamblado en .NET 3.5. En particular, el conjunto en sí no está disponible, es solo el nombre. Puedo pensar en muchas formas de hacerlo a mano pero supongo que me puede faltar alguna característica para hacer eso en las bibliotecas del sistema. ¿Cualquier sugerencia?¿Nombre calificado del ensamblado de análisis?

+1

¿Qué es un montaje? – Kieveli

+3

Me refiero a los ensamblados .NET aquí. –

Respuesta

18

La clase AssemblyName puede analizar el nombre del ensamblado, simplemente pase la cadena a su constructor. Si tiene un nombre de ensamblado calificado, creo que primero tendrá que eliminar la parte de tipo de cadena (es decir, todo hasta la primera coma).

+4

Despojar el nombre suele ser muy complejo. Considere incluso la simple Tuple : "System.Tuple'2 [[System.Int32, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089], [System.String, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]], mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 " – Yurik

+7

El constructor AssemblyName arroja FileLoadException a menos que sea capaz de cargar el ensamblaje –

-1

Echa un vistazo a la clase Path. Tiene un montón de funciones de análisis para nombres de archivos. O usted podría intentar:

string qualType = @"System.String, mscorlib, Version=2.0.0.0, Culture=neutral, publicKeyToken=b77a5c561934e089"; 
Type t = Type.GetType(qualType, false); 
if (t == null) 
{ 
    Console.WriteLine("Invalid qualified type string."); 
    return; 
} 
Console.WriteLine(t.FullName); 

Así que tienes algo como esto?

Assembly assem = Assembly.LoadFile("PathToTheAssembly.dll"); 
Type t = assem.GetType("Namespace.And.Type.Name"); 
t.FullName 

Si usted está buscando para analizar la forma BNF, el ejemplo anterior utilizando GetType debe trabajar para usted.

EDIT: Ok, esto debería hacer lo que quiera suponiendo que tiene el nombre:

Assembly assem = Assembly.GetAssembly(Type.GetType(assembly_qualified_name, false)); 
if(assem != null) 
{ 
    byte[] pkt = assem.GetName().GetPublicKeyToken(); 
    Version ver = assem.GetName().Version; 
    CultureInfo ci = assem.GetName().CultureInfo(); 
} 
+0

El ensamblado en sí no está disponible, por lo que no puedo utilizar Type.GetType. –

+0

¿Tan solo el nombre del conjunto de cadenas? ¿Puedes publicar lo que realmente tienes? – SwDevMan81

-1

Si ensamblado cargado se puede usar algo así:

Assembly assembly = Assembly.GetExecutingAssembly(); 
    string assemblyName = assembly.GetName().Name; 

En el ejemplo anterior he utilizado un ensamblaje en ejecución pero recorre su ensamblaje cargado.

Actualización: Siempre puede cargar un ensamble en un Dominio de aplicación diferente obtener el nombre del ensamblado y, una vez que haya terminado, descargarlo. Avíseme si necesita una muestra.

+0

Bueno, precisamente, no tengo el conjunto a mano. Me gustaría analizar la cadena que representa su nombre. –

+0

@Joannes, vea la parte de actualización en la respuesta. – Vadim

4

De .Net 4 y en la que tiene un nuevo reemplazo para Type.GetType:

public static Type GetType(
    string typeName, 
    Func<AssemblyName, Assembly> assemblyResolver, 
    Func<Assembly, string, bool, Type> typeResolver, 
    bool throwOnError, 
    bool ignoreCase 
) 

Ver http://msdn.microsoft.com/en-us/library/ee332784%28v=vs.100%29.aspx

Lo que necesita do es en el ejemplo de la documentación anterior:

Type t2 = Type.GetType(test, 
      (aName) => aName.Name == "MyAssembly" ? 
       Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") : 
       Assembly.Load(aName), 
      (assem, name, ignore) => assem == null ? 
       Type.GetType(name, false, ignore) : 
       assem.GetType(name, false, ignore), true 
); 

Puede reemplazar las lambdas anteriores por funciones más complejas.

Cuestiones relacionadas