2014-02-25 13 views
45

Das Thema ist ziemlich vage, da ich nicht sicher bin, was ist die richtige Terminologie für das, was ich versuche zu tun.Wie eine Klasse in einer DLL ersetzen?

Ich habe eine dll heruntergeladen (ich habe nicht den Quellcode), und mit einem Reflexionstool, fand ich einen Fehler in der dll Implementierung. Der Fehler ist einfach zu beheben. Also lassen Sie uns sagen, der Fehler ist hier:

class A 
{ 
    void f() { // BUG!!! } 
} 

Gibt es eine Möglichkeit, meine eigene A zu implementieren, die den Fehler beheben würde und injizieren sie in der Laufzeit ersetzen andere A Instanzen?

+0

Es hängt wirklich davon ab, was der Fehler innerhalb der Klasse tut. Sie könnten möglicherweise von dieser Klasse erben (wenn sie nicht "versiegelt" ist) und die Methodenimplementierung, die den Fehler enthält, mit Nachdruck ausblenden. –

+6

Haben Sie Zugriff auf Entwickler der DLL? Wenn ja, bitten Sie ihn, Änderungen vorzunehmen. Bis dahin kannst du seine Lieblingskaffeetasse entführen. – danish

+0

Duplizieren: http://stackoverflow.com/questions/1518891/fix-bugs-in-net-program-without-access-to-source –

Antwort

71

Wenn Sie .NET 4.0 verwenden. oder höher, werfen Sie einen Blick auf die: MethodRental.SwapMethodBody Method

Andere Art und Weise: CLR Injection: Runtime Method Replacer

+0

Ich wusste nie darüber. Vielen Dank. Ist das kein Sicherheitsproblem? Was passiert, wenn ich einfach den Body der Login-Methode in einer DLL ersetze? – danish

+3

@danish "Die Methode kann nur von dem Client aufgerufen werden, der das dynamische Modul erstellt hat, das den Typ enthält, dessen Methode getauscht wird." Dies bedeutet, dass keine Privilegien-Eskalation vorhanden ist, da Änderungen nur in Prozessen sichtbar sind, die Sie bereits steuern. –

+2

Können Sie die Existenzprüfung einer Lizenzdatei mit dieser Methode nicht entfernen? – Thomas

8

Der einfachste Weg, aus dieser Klasse erben würde und eine eigene Implementierung schreiben.

class ParentClass 
      { 
       public void SomeMethod() { 
        //bug here 
       } 
      } 

      class Child:ParentClass 
      { 
       new public void SomeMethod() { 
        // I fixed it 
       } 
      } 

Hiernach verwenden Sie Ihre Klasse.

Child child = new Child(); 
child.SomeMethod(); 
+3

Beachten Sie, dass Sie es als "Kind" -Typ nennen müssen, auch 'UseThatParentClass (ParentClass ins);' -> 'UseThatParentClass (new Child());' wird Standard SomeMethod aufrufen (das fehlerhafte in ParentClass, nicht bei Ihre Child-Klasse), weil so das "neue" Schlüsselwort funktioniert - es ist nichts wie Vererbung (virtual/override), es ist eher wie "zwei Methoden haben denselben Namen" –

Verwandte Themen