¿Cómo funciona Type.GetType cuando se le da un nombre de tipo parcialmente calificado?

En numerosos lugares encuentro nombres de tipos parcialmente calificados de la forma FullTypeName, AssemblyName , es decir, como Type.AssemblyQualifiedName solo sin la versión, culture y publicKeyToken calificadores.

Mi pregunta es ¿cómo se puede convertir al Type respectivo en un mínimo de esfuerzo? Pensé que Type.GetType hace el trabajo, pero desafortunadamente no. El siguiente código, por ejemplo, devuelve null :

 Type.GetType("System.Net.Sockets.SocketException, System"); 

Por supuesto, si especifico el nombre completo, funciona:

 Type.GetType("System.Net.Sockets.SocketException, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); 

Muchas gracias.

Si el archivo DLL en el que se encuentra no está ya cargado en el dominio de la aplicación (por ejemplo, si lo usó), necesita la ruta completa como esta, si ya está cargada, puede encontrarla con la versión más corta.

Para responder a su pregunta: la segunda versión siempre funciona, quédese con ella y tendrá una forma de preocuparse.

Si el ensamblaje se ha cargado en el dominio actual, el siguiente código generalmente funciona:

 public static Type GetTypeEx(string fullTypeName) { return Type.GetType(fullTypeName) ?? AppDomain.CurrentDomain.GetAssemblies() .Select(a => a.GetType(fullTypeName)) .FirstOrDefault(t => t != null); } 

Puedes usarlo así:

 Type t = GetTypeEx("System.Net.Sockets.SocketException"); 

El código que trabaja con la forma abreviada es:

  Assembly a = Assembly.LoadWithPartialName(assemblyName); Type t = a.GetType(typeName); 

pero LoadWithPartialName está en desuso, así que supongo que debes quedarte con el formulario largo.

Después de haber pasado por un problema similar con algún código heredado, no creo que la primera afirmación en la respuesta aceptada sea correcta. No importa si el ensamblaje ya está cargado o no.

De acuerdo con la documentación, Type.GetType (string) requiere un AssemblyQualifiedName , a menos que el tipo en cuestión se encuentre en el ensamblado que se está ejecutando actualmente o en mscorlib, en cuyo caso el nombre de tipo calificado de espacio de nombres es todo lo que se requiere.

Tenga en cuenta que un AssemblyQualifiedName incluye el DisplayName completo del ensamblaje del tipo (con versión, cultura y token de clave pública).

La versión corta no funcionará a menos que intercepte la carga de tipo fallida con un AssemblyResolver personalizado (que en realidad era el caso de mi problema, enmascarando otro problema).

Es cierto que Type.GetType (cadena) requiere un AssemblyQualifiedName. Esto puede ser de muchas formas:

 MyNS.MyType, MyAssembly, Version=xxxx, Culture=xxx, PublicKeyToken=XXXXXXXXXX 

Los siguientes son también válidos AssemblyQualifiedNames:

 MyNS.MyType, MyAssembly, Version=xx, Culture=xxx, PublicKeyToken=XXXXXXXXXX MyNS.MyType, MyAssembly, Culture=xxx, PublicKeyToken=XXXXXXXXXX MyNS.MyType, MyAssembly, PublicKeyToken=XXXXXXXXXX MyNS.MyType, MyAssembly 

Para un ensamblaje firmado, el mínimo requerido para un FullyQualifiedAssemblyName es:

 MyNS.MyType, MyAssembly, PublicKeyToken=XXXXXXXXXX 

Para un ensamblaje sin firmar, el mínimo requerido para un FullyQualifiedAssemblyName es:

 MyNS.MyType, MyAssembly 

No es necesario que todas las “agitaciones manuales” estén en los fragmentos de código que otros han proporcionado. Asegúrese de que sus nombres de tipo estén configurados correctamente y que pueda acceder a sus tipos (y cargar ensamblajes dinámicamente) con un alto grado de flexibilidad. Hago esto regularmente

En el ejemplo de OP usando:

 Type.GetType("System.Net.Sockets.SocketException, System") 

El motivo del error fue la ausencia de PublicKeyToken. Los ensamblados .Net FW están todos firmados y, por lo tanto, requieren que PublicKeyToken resuelva el nombre del ensamblado. Lo siguiente funcionaría:

 Type.GetType("System.Net.Sockets.SocketException, System, PublicKeyToken=b77a5c561934e089")