Überschreibungsmethode in DLL mit Reflektion

8

Ich bin mir nicht einmal sicher, ob das möglich ist, also entschuldige mich wenn nicht. Ich habe ziemlich ausgiebig gegoogelt und nicht gefunden, wonach ich suche.

Grundsätzlich haben wir eine Anwendung, die von einer dritten Partei produziert wird, was vollkommen unverblümt ist, ist Quatsch. Wir haben ein besonderes Problem und konnten das Problem mit ILSpy zu einer Methode innerhalb einer DLL verfolgen. Offensichtlich haben wir den Quellcode nicht (und können ihn auch nicht bekommen) und das betreffende Unternehmen ist nicht bereit, das Problem in einem angemessenen Zeitrahmen zu lösen.

Also haben wir verschiedene Wege der Untersuchung untersucht und haben nichts gefunden. Ich habe untersucht, ob dies mit Reflektion getan werden kann, und das ist so ziemlich die letzte Hoffnung, die wir haben, um das zu erreichen. Kurz gesagt, was ich gerne tun würde, ist folgendes:

  • Erstellen Sie eine einfache Klassenbibliothek mit demselben Namen wie die vorhandene DLL
  • Verwenden Sie reflection, um die Methoden aus der vorhandenen DLL zu importieren
  • Irgendwie überschreiben Sie die betreffende Methode mit meinem eigenen, korrekten Code
  • Erstellen Sie den Code neu, also habe ich eine neue DLL, die 99% der Funktionalität der vorhandenen DLL enthält, aber mit meinem Override-Code, der die korrekte Funktionalität bietet.

Ich habe während meiner Untersuchungen TypeBuilder.DefineMethodOverride und auch eine Seite aus StackOverflow gefunden, die ähnlich aussieht, aber nicht ganz das was ich suche.

Ссылка

Gibt es eine Möglichkeit, ein "zu überschreiben" a Methode mit Reflexion?

Irgendein Rat geschätzt!

Andrew

Bearbeiten

Die andere mögliche Idee, die ich habe, war, eine partielle Klasse zu erzeugen, die die Override-Funktion enthält, aber das schien auch nicht machbar.

    
Andrew 18.06.2013, 13:54
quelle

4 Antworten

6

Sie können die Methode nur überschreiben, wenn sie virtuell ist, und es spielt keine Rolle, ob Sie dies über Reflektion oder statisch tun. Ich würde vorschlagen, einen Decompiler zu verwenden (es gibt viele freie verfügbar) und den Code in MSIL zu reparieren. Dann können Sie eine neue Assembly aus dem MSIL generieren.

    
Marek Dzikiewicz 18.06.2013, 14:00
quelle
0

Ich denke, deine erste Idee ist gut. Wenn die Klasse der dritten Partei nicht sealed ist, können Sie daraus ableiten und eine eigene Methode mit einem anderen Namen hinzufügen, um das falsche Verhalten zu korrigieren. Wenn Sie es in 1 DLL benötigen, können Sie IlMerge verwenden .

Wenn Ihre Drittanbieterklasse versiegelt ist, können Sie einfach eine Instanz dieser Drittanbieterklasse in Ihrer neuen Klasse haben und die Methoden bei Bedarf aufrufen.

Aber Sie müssen überprüfen, dass die Methode, die Sie "überschreiben" wollen, nicht innerhalb dieser Bibliothek aufgerufen wird, denn wenn es diese Lösung nicht funktioniert ...

Es ist nicht sehr sauber, aber es kann eine temporäre Lösung sein, während das Unternehmen, das die Bibliothek bearbeitet, das Problem behebt.

Und wenn es behoben ist, müssen Sie nur die Methode umbenennen, die Sie verwenden, so dass es nicht zeitaufwendig ist.

    
ppetrov 18.06.2013 14:36
quelle
0

Nach dem, was Sie beschrieben haben, würde ich empfehlen, die ursprüngliche Baugruppe zu ändern. Der Prozess ist im Wesentlichen

  • Dekompilieren Sie die Assembly in MSIL, C # oder die Sprache, die Sie auswählen
  • Ändern Sie die dekompilierte Assembly so, dass sie Ihre Änderungen enthält
  • Kompilieren Sie die Assembly erneut mit der geänderten Quelle

Von dem, was ich sehen kann Reflexil können Sie genau das tun, obwohl es möglicherweise erfordern, dass Sie Resharper kaufen (ich habe es nicht versucht ich selbst)

Alternativ können Sie ILDasm verwenden, um die gesamte Datei zu dekompilieren Assembly in einer einzigen Datei, ändern Sie die Datei und kompilieren Sie sie dann mit ILAsm

    
Justin 18.06.2013 14:44
quelle
0
Ich weiß, ich komme etwas spät dran, aber ich stimme mit Charleh überein; Wenn Sie eine Klasse haben, die sich nicht gut verhält und der Substitution nicht förderlich ist, aber zumindest ihre Methoden als virtual deklariert, dann haben Sie Glück. Im Folgenden werden Verweise auf Castle.Core und Patterns verwendet:

%Vor%

Ich habe mir auch die Freiheit genommen, ein laufendes Beispiel in LinqPad bereitzustellen. Es zeigt den Unterschied zwischen Methoden, die Interception erlauben ( virtual Einsen) und solchen, die dies nicht erlauben. Es zeigt auch eine nützliche Möglichkeit zum Abfangen von Ausnahmen ohne den gesamten Code mit Try.Do von Patterns .

    
John Batte 08.12.2013 02:16
quelle

Tags und Links