2011-05-27 2 views
5

J'utilise le programme Reflexil pour injecter une référence dans l'exécutable Foo1.exe à un assembly externe nommé Foo2.dll.System.TypeLoadException - Méthode get _ *** dans le type *** de l'assembly *** n'a pas d'implémentation quand c'est le cas?

Dans Foo1.exe, il existe une classe appelée Barre.

Dans Foo2.dll, il existe une interface IBar qui implémente correctement tous les champs et méthodes de Bar.

J'ai utilisé Reflexil pour donner à Bar dans Foo1.exe l'interface IBar dans Foo2.dll.

Lorsque les charges Foo1.exe, il trouve Foo2.dll situé dans le répertoire de l'application et la charge, mais il jette un System.TypeLoadException avec le message d'erreur suivant Method 'get_***' in type 'Foo1.Bar' from assembly 'Foo1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.

J'ai déjà lu la question précédente avec le même message d'erreur (TypeLoadException says 'no implementation', but it is implemented), mais j'ai été incapable de comprendre comment implémenter correctement le correctif lorsque je n'ai aucune vérification de compilateur pour Foo1.exe.

Merci pour votre aide!

Répondre

4

J'ai le même message d'erreur dans la situation suivante: A.dll dépend de B.dll, B.dll dépend de C.dll et C.dll est introuvable. Dans mon cas, A.dll contient une classe C2 dérivée de la classe abstraite C1 située dans le même assemblage et dans la même DLL - A.dll. C1 est dérivé de la classe C0 de B.dll. C0 a une propriété abstraite avec la méthode getter abstraite, C1 a une implémentation de cette propriété mais le problème est que le type de retour du getter de la propriété est défini dans la bibliothèque absente C.dll. Enfin, il conduit au message d'erreur "Méthode 'get_Prop' dans le type 'C2' de l'assembly 'A, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = xxxx' n'a pas d'implémentation." ce qui est plutôt hors de propos dans cette situation. En bref, le code source ressemble à ceci:

C.dll:

namespace C { 
    public enum PropType {V1 = 0, V2 = 1, ...} 
} 

B.dll:

using C; 
namespace B { 
    public abstract class C0 { 
    ... 
    public abstract C.PropType Prop {get;} 
    } 
} 

A.dll:

using C; 
using B; 
namespace A { 
    public abstract class C1 : B.C0 { 
    ... 
    // Getter implementation 
    public override C.PropType Prop { get {return C.PropType.V1;}} 
    } 
} 

using C; 
using B; 
namespace A { 
    // Class implementation 
    public class C2 : C1 { 
    ... 
    } 
} 

Donc la solution est d'ajouter C.dll à l'installation.

Questions connexes