2012-05-28 6 views
9

Estoy intentando cargar dinámicamente un ensamblado de cifrado pero mi GetType devuelve nulo, aunque utilizo el nombre de clase correcto. Aquí está el código:Assembly.GetType está devolviendo nulo

//Load encryption assembly. 
Assembly encryptionAssembly = Assembly.LoadFrom("Encryption.dll"); 
foreach(Type t in encryptionAssembly.GetTypes()) 
    { 
     MessageBox.Show(t.Name.ToString()); 
     // This shows "Encryption" 
    } 
Type encryptionClass = encryptionAssembly.GetType("Encryption"); 
// But this returns null 

Tengo un poco de dolor de cabeza con este. La clase es pública y definitivamente la deletreé correctamente.

Gracias de antemano.

+0

¿cómo se declara esa clase? – Tigran

+0

Olvidó usar el Examinador de objetos en VS. –

+0

@HansPassant - Sí, lo hice absolutamente. Detención para mí esta noche. – Ste

Respuesta

12

Aquí

MessageBox.Show(t.FullName.ToString()); //FULLNAME 

imprimir el FullName del tipo y después del uso queFullName para obtener el tipo del ensamblaje.

+0

Gracias. Esto lo hizo por mí. 'FullName' me dice que es" MyCompany.Library.Encryption ". Supongo que eso es lo que sucede cuando alguien te envía un dll por correo electrónico y dice "¡aquí está el ensamblaje de encriptación para usar"! Es una pena que no pueda aceptar todas las respuestas, ya que otros también señalaron que necesitaba el espacio de nombres. Los renunciaré también. – Ste

+0

Además, asegúrese de que la clase tenga un constructor() – timothy

4

intente especificar el nombre completo del tipo de cifrado (namespace.classname)

+0

si no lo sabes intente buscarlo con reflector – eyossi

+0

Gracias por eso. +1. Sin embargo, he tenido que aceptar la respuesta de Tigran porque me proporcionó la forma más rápida de determinar 'FullName'. – Ste

7

Debe especificar un espacio de nombres completo de un tipo, por ejemplo:

encryptionAssembly.GetType("My.Namespace.Encryption") 

se puede saber que el uso de t.FullName

+1

+1. Gracias. Tengo la sensación de que será útil de nuevo en el futuro. – Ste

0

No conocía el nombre completo de mi ensamblado en tiempo de ejecución, pero pude obtener el tipo utilizando solo el nombre de clase de ExportedTypes de la ensambladura. Por ejemplo, para obtener un tipo de exportación de "nombre de clase":

var assembly = Assembly.LoadFile(dllPath); 
var types = assembly.ExportedTypes; 
if(types != null) 
{ 
    var type = types.Where(x => x.Name == "ClassName").FirstOrDefault(); 
} 

Si hubo múltiples tipos con el nombre idéntico de "nombre de clase" esto sólo se conseguiría la primera, pero esta es una solución segura para los archivos DLL Estoy cargando

0

En mi caso, faltaba el archivo/archivo .cs en mi proyecto. Agregué el archivo cs perdido y funcionó como el encanto. Tengo un proyecto de cs llamado ProjectA. En eso, el código está buscando el nombre de clase completo ProjectA.ClassA. Cuando recibo este error, fui a ProjectA y vi que ClassA.cs faltaba debido al problema de fusión. Agregué/incluí ClassA.cs a ProjectA y funcionó bien.

Cuestiones relacionadas