2010-11-15 11 views

Respuesta

20

En términos de "lo que está en la caja", solo puede tenerlo al revés, utilizando la API ModuleDefinition.Import.

Para pasar de TypeReference a System.Type, deberá buscarlo manualmente utilizando Reflection y el AssemblyQualifiedName. Tenga en cuenta que Cecil usa las convenciones de IL para escapar de las clases anidadas, etc., por lo que debe aplicar alguna corrección manual.

Si solo quiere resolver tipos no genéricos y no anidados, debería estar bien.

pasar de una TypeReference a un TypeDefition (si eso es lo que quería decir) lo que necesita para TypeReference.Resolve();


solicitada código de muestra:

TypeReference tr = ... 
Type.GetType(tr.FullName + ", " + tr.Module.Assembly.FullName); 
// will look up in all assemnblies loaded into the current appDomain and fire the AppDomain.Resolve event if no Type could be found 

Las convenciones utilizadas en la reflexión se explican here , para las convenciones de Cecils, consulte el Código fuente de Cecil.

+0

También tenga en cuenta que no se construye Mono.Cecil sobre System.Reflection (siendo una biblioteca independiente), eso significa que no hay una forma directa de convertirlos entre sí. Deberías poder hacer eso, pero no se verá bien. – ShdNx

+0

Entonces, ¿con qué reflexión buscaría el tipo? ¿Y tiene un ejemplo de un tipo anidado de reflexión y un tipo anidado cecil? – Will

+7

En lugar de agregar manualmente ",", puede usar Assembly.CreateQualifiedName (tr.Module.Assembly.FullName, tr.FullName). – user276648

2

Para los tipos genéricos se necesita algo como esto:

public static Type GetMonoType(this TypeReference type) 
    { 
     return Type.GetType(type.GetReflectionName(), true); 
    } 

    private static string GetReflectionName(this TypeReference type) 
    { 
     if (type.IsGenericInstance) 
     { 
      var genericInstance = (GenericInstanceType)type; 
      return string.Format("{0}.{1}[{2}]", genericInstance.Namespace, type.Name, String.Join(",", genericInstance.GenericArguments.Select(p => p.GetReflectionName()).ToArray())); 
     } 
     return type.FullName; 
    } 

Tenga en cuenta que este código no maneja tipos anidados, por favor marque la respuesta @JohannesRudolph para este

Cuestiones relacionadas