2017-05-15 5 views
1

Ich habe ein Problem mit dem folgenden Code:System.BadImageFormatException, wenn sie versuchen Konstruktor System.Collections.Generic.GenericComparer`1 zu lösen

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

Jedesmal, wenn ich es ausführen es gibt mir die folgende Fehlermeldung:

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) 

wenn jedoch insteaf von

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

benutze ich seine Basisklasse

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

dann gibt "ResolveMethod" OK zurück.

Weiß jemand, warum diese Klasse nicht "aufgelöst" werden kann?

Vielen Dank!

+0

I haben versucht, die Anwendung in 32-Bit- und 64-Bit, und beide geben, um den Fehler zu bauen. Ich glaube nicht, dass es damit zu tun hat. – Florin

+0

Vielleicht weil 'GenericComparer' intern ist? –

+0

Denke nicht so .. Ich habe versucht mit System.Collections.StructuralComparer, das ist auch intern, und es funktioniert .. – Florin

Antwort

0

Es sagt, dass es wahrscheinlich aufgrund eines Mangels an generischen Kontext ist. Sie können den Unterschied in ihren Basisklassen sehen, wenn Sie sich den Typ anschauen, den System.Collections.Generic.GenericComparer `1 von ihm ableitet, ist nicht von der Basisklasse, die Sie mindestens gesagt haben, wenn ich es kontrolliere. Es hat nicht einmal einen FullName. Es hat auch ein GenericTypeArgument [1], während t1 dies in meinem Beispiel nicht tut.

 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

Das ist interessant .. Ich habe einen Blick mit dotPeek und GenericComparer'1 erbt von Comparer'1 ' interne Klasse GenericComparer : Comparer wobei T: IComparable ' – Florin

0

Ich frage, ob es eine Lösung dafür ist, weil ich DeepCloner bin mit ein paar Objekte zu klonen, und einige von ihnen haben Eigenschaften, die IEnumerable und ihr Wert ist ein Ausdruck, der durch einen Auftrag enthält oder es führt eine Abfrage an die DB aus.

Wenn ich versuche, diese Art von Objekt zu klonen, gibt DeepCloner diese Ausnahme, wenn versucht, den Konstruktor System.Collections.Generic.GenericComparer'1 aufzulösen oder wenn versucht, andere Methoden zum Abfragen der DB zu lösen.

Dies ist ein Beispiel in 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 
Verwandte Themen