Parsing assembly qualified name?


Me gustaría analizar un nombre calificado de ensamblado en.NET 3.5. En particular, el ensamblado en sí no está disponible, es solo el nombre. Se me ocurren muchas formas de hacerlo a mano pero supongo que me falta alguna característica para hacerlo en las bibliotecas del sistema. Alguna sugerencia?

Author: Roger Lipscombe, 2009-09-11

5 answers

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

 18
Author: Mattias S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-11 12:48:25

Hay una implementación de parser en Mono y BNF grammar en MSDN

 4
Author: Pavel Savara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-10 23:00:15

Desde.Net 4 y en adelante tiene una nueva sobreescritura para Type.GetType:

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

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

Lo que necesita hacer está 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 con funciones más complejas.

 4
Author: Silviu Paragina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-09 12:45:31

Si se carga el ensamblado, puede usar algo así:

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

En el ejemplo anterior utilicé un ensamblado de ejecución, pero usted recorre el ensamblado cargado.

Actualización: Siempre puede cargar un ensamblado en un AppDomain separado obtenga el nombre del ensamblado y, una vez que haya terminado, descárguelo. Avísame si necesitas una muestra.

 -1
Author: Vadim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-11 13:07:02

Echa un vistazo a la clase Path. Tiene un montón de funciones de análisis de 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);

¿Entonces tienes algo como esto?

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

Si está buscando analizar el formulario BNF, el ejemplo anterior usando GetType debería funcionar para usted.

EDITAR: Ok, esto debería hacer lo que quieras asumiendo que tienes 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();
}
 -2
Author: SwDevMan81,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-11 12:34:52