Cómo obtener la asamblea del Sistema.Reflexión.La asamblea) para un determinado tipo de .Neta?

En .Net, dado un nombre de tipo, hay un método que me dice en la cual la asamblea (instancia de Sistema.Reflexión.La asamblea) que el tipo se define?

Supongo que mi proyecto ya tiene una referencia a la asamblea, sólo tiene que saber lo que uno es.

5 Kommentare

  1. 37

    De la asamblea.GetAssembly se supone que tiene una instancia de la clase, y el Tipo.GetType se supone que el tipo completo nombre que incluye el nombre del ensamblado.

    Si usted sólo tiene la base del nombre del tipo, necesita hacer algo más parecido a esto:

    public static String GetAssemblyNameContainingType(String typeName) 
    {
        foreach (Assembly currentassembly in AppDomain.CurrentDomain.GetAssemblies()) 
        {
            Type t = currentassembly.GetType(typeName, false, true);
            if (t != null) {return currentassembly.FullName;}
        }
    
        return "not found";
    }

    Esto también supone la prestación de su tipo declarado en la raíz. Usted necesitará proporcionar el espacio de nombres o tipos envolventes en el nombre, o repetir de la misma manera.

    • Probablemente me tire una excepción ArgumentException en el caso de que no pueda encontrar lo que estás buscando. Presumiblemente, que sería el caso excepcional, y, a continuación, también puede asumir que usted lo encontró (o poner control de código de error en una instrucción catch)
    • PERO, de la Asamblea.GetAssembly no necesita de una instancia del tipo, sólo se necesita el tipo, así que si usted está buscando algo que usted sabe el tipo en tiempo de compilación, puede utilizar typeof(Tipo) como en el primer ejemplo.
    • Gracias por las respuestas, es que funciona como un encanto para mí. Yo no tenía el Tipo, sólo el nombre del tipo y saber que una referencia a un ensamblado que contiene que estaba disponible.
  2. 33
    Assembly.GetAssembly(typeof(System.Int32))

    Reemplazar System.Int32 con cualquier tipo de suceder a necesitar. Porque acepta un Type parámetro, usted puede hacer casi cualquier cosa de esta manera, por ejemplo:

    string GetAssemblyLocationOfObject(object o) {
        return Assembly.GetAssembly(o.GetType()).Location;
    }
    • Como una nota al margen, yo uso esa función exacta como una forma de rellenar el ReferencedAssemblies lista cuando se utiliza el CSharpCodeProvider para compilar C# dinámicamente.
    • Eso es un truco muy útil, pero el cartel original sólo tiene el nombre del tipo, no el Tipo de instancia.
  3. 3

    Me he adaptado el aceptado respuesta para mis propios fines (la devolución de la asamblea objeto en lugar del nombre de ensamblado), y refactorizar el código para VB.NET y LINQ:

    Public Function GetAssemblyForType(typeName As String) As Assembly
        Return AppDomain.CurrentDomain.GetAssemblies.FirstOrDefault(Function(a) a.GetType(typeName, False, True) IsNot Nothing)
    End Function

    Sólo estoy compartiendo aquí, si alguien más desea un LINQy solución a la aceptación de la respuesta.

  4. 2
    Type.GetType(typeNameString).Assembly
    • Los métodos que se espera una asamblea-nombre completo. Estás seguro de que funciona de la cruz-de la asamblea si no se califican con el nombre de ensamblado?
  5. 0

    Si se puede usar, esta sintaxis es el más corto/más limpio:

    typeof(int).Assembly
    • ¿Incluso leer la OPs pregunta antes de publicar una respuesta genérica como que? El OP no tiene el tipo y sólo el nombre de la cadena. Esta respuesta ignora por completo el hecho.
    • Estás haciendo al igual que en muchos supuestos, como yo hice. Al escribir mi respuesta genérica, yo comencé con un nombre de tipo (int) y escribió una expresión para obtener la asamblea donde se define. Ni una sola vez en todo este hilo hice el OP dice que él tenía el tipo de nombre como una cadena.
    • Lo hizo en realidad. Mira en la firma del método (string nombre). El OP dijo que sólo tenía el nombre del tipo. De ahí mi referencia a la cadena de nombre de tipo.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea