2017-05-15 1 views
1

J'ai un problème avec le code suivant:System.BadImageFormatException lorsque vous essayez de résoudre constructeur de System.Collections.Generic.GenericComparer`1

var type1 = typeof(object); 
var type2 = type1.Module.GetType("System.Collections.Generic.GenericComparer`1"); 
var constr = type2.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); 
var byteArray = constr.GetMethodBody().GetILAsByteArray(); 
var result = type2.Module.ResolveMethod(BitConverter.ToInt32(byteArray, 2)); 

Chaque fois que je l'exécute, il me donne l'erreur suivante:

An exception of type 'System.BadImageFormatException' occurred in mscorlib.dll and wasn't handled before a managed/native boundary 
Additional information: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B) 

Cependant, si insteaf de

var type2 = type1.Module.GetType("System.Collections.Generic.GenericComparer`1"); 

J'utilise sa classe de base

var type2 = type1.Module.GetType("System.Collections.Generic.Comparer`1"); 

puis "ResolveMethod" renvoie OK.

Est-ce que quelqu'un sait pourquoi cette classe ne peut pas être "résolue"?

Merci!

+0

J'ai essayé de construire l'application à la fois 32 bits et 64 bits, et les deux donnent l'erreur. Je ne pense pas que cela ait quelque chose à voir avec ça. – Florin

+0

Peut-être parce que 'GenericComparer' est interne? –

+0

Ne le crois pas .. J'ai essayé avec System.Collections.StructuralComparer, qui est aussi interne, et ça marche .. – Florin

Répondre

0

Il dit que c'est probablement dû à un manque de contexte générique. Vous pouvez voir la différence dans leurs classes de base parce que si vous regardez le type que System.Collections.Generic.GenericComparer`1 en dérive, ce n'est pas de la classe de base que vous avez dit au moins quand je l'inspecte. Il n'a même pas de nom complet. Il a aussi un GenericTypeArgument [1] alors que t1 ne l'est pas dans mon exemple ci-dessous.

 var t1 = Type.GetType("System.Collections.Generic.Comparer`1"); 
     var t2 = Type.GetType("System.Collections.Generic.GenericComparer`1").BaseType; 
     bool assignable = t1.IsAssignableFrom(t2); 
+0

C'est intéressant .. J'ai jeté un coup d'oeil avec dotPeek et GenericComparer'1 hérite de Comparer'1 ' classe interne GenericComparer : Comparer où T: IComparable ' – Florin

0

Je me demande s'il y a une solution pour cela parce que j'utilise DeepCloner pour cloner des objets, et certains d'entre eux ont des propriétés qui sont IEnumerable et leur valeur est une expression qui contient une commande par ou il fait une requête à la base de données. Lorsque j'essaie de cloner ce type d'objet, DeepCloner donne cette exception quand il essaie de résoudre le constructeur de System.Collections.Generic.GenericComparer'1 ou lorsqu'il essaie de résoudre d'autres méthodes nécessaires pour interroger la base de données.

Voici un exemple dans vb.net:

Public Class cls1 
     Public Property prop2 As Integer 
    End Class 


    Public Class cls0 
     Public Property prop1 As IEnumerable(Of cls1) 
    End Class 

    Private Sub doClone() 
     Dim ob1 = New cls0() 
     Dim source = New List(Of cls1) 
     For i = 0 To 10 - 1 
      source.Add(New cls1() With {.prop2 = i}) 
     Next 
     ob1.prop1 = (From a In source Where a.prop2 < 5 Order By a.prop2 Select a) 
     ob1.DeepClone() 
    End Sub