2010-11-15 27 views

Répondre

20

En termes de "ce qui est dans la boîte" vous ne pouvez l'avoir qu'à l'envers, en utilisant l'API ModuleDefinition.Import.

Pour passer d'un TypeReference à un System.Type, vous devrez le rechercher manuellement à l'aide de Reflection et de AssemblyQualifiedName. Sachez que Cecil utilise les conventions IL pour échapper les classes imbriquées, etc., vous devez donc appliquer une correction manuelle.

Si vous souhaitez uniquement résoudre des types non génériques et non imbriqués, cela ne pose aucun problème.

Pour passer d'un TypeReference à un TypeDefition (si c'est ce que vous vouliez dire), vous devez d'TypeReference.Resolve();


code demandé Exemple:

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 

Les conventions utilisées dans la réflexion sont expliqués here , pour les conventions de Cecil, consulter le code source de Cecil.

+0

Notez également que Mono.Cecil est pas construit sur System.Reflection (étant une bibliothèque indépendante), cela signifie qu'il n'y a pas de moyen direct de les convertir les uns aux autres. Vous devriez toujours être capable de le faire, mais ça ne sera pas joli. – ShdNx

+0

Alors, comment avec la réflexion je chercherais le type? Et avez-vous un exemple d'un type imbriqué de réflexion et d'un type imbriqué cecil? – Will

+7

Au lieu d'ajouter manuellement ",", vous pouvez utiliser Assembly.CreateQualifiedName (tr.Module.Assembly.FullName, tr.FullName). – user276648

2

Pour les types génériques dont vous avez besoin quelque chose comme ceci:

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; 
    } 

S'il vous plaît noter ce code ne gère pas les types imbriqués, s'il vous plaît vérifier @JohannesRudolph réponse à cette