Überschreibende Methode in der DLL mit der spiegelung
Ich bin nicht einmal sicher, ob dies möglich ist, also entschuldigt, wenn nicht. Ich habe Recht ausführlich gegoogelt und nicht das gefunden was ich Suche.
Im Grunde haben wir eine Anwendung, die von einem Dritten produziert, die, um vollkommen stumpf ist Quatsch. Wir haben ein bestimmtes Problem und es geschafft haben, zu verfolgen, das problem mit ILSpy zu einer Methode in einer DLL. Natürlich haben wir keine (noch nicht in der Lage sind zu bekommen) den Quellcode und das Unternehmen in Frage, die nicht Willens ist, das problem zu beheben, in jeder angemessenen Zeitrahmen.
So, haben wir untersucht verschiedene Wege der Untersuchung und kommen mit nichts. Ich habe auf der Suche zu sehen, ob dies getan werden kann, unter Verwendung von reflektion und das ist so ziemlich die Letzte Hoffnung, die wir haben, um diese zu arbeiten. In einer nussschale, was ich tun möchte ist Folgendes:
- Erstellen eine einfache Klasse Bibliothek mit dem gleichen Namen wie die vorhandenen DLL -
- Reflektion verwenden, um importieren Sie die Methoden aus der vorhandenen DLL -
- Irgendwie überschreiben Sie die Methode in Frage, mit meinem eigenen, richtigen code
- Wiederaufbau der code, also habe ich eine neue DLL, mit 99% der Funktionalität des bestehenden DLL aber mit meinem override-code mit der richtigen Funktionalität.
Ich gefunden habe, während meiner Untersuchungen TypeBuilder.DefineMethodOverride und auch eine Seite von StackOverflow, das scheint ähnlich, aber nicht ganz das, was ich Suche.
http://msdn.microsoft.com/en-us/library/system.reflection.emit.typebuilder.definemethodoverride.aspx
Gibt es eine Möglichkeit, zu "überschreiben", eine Methode, mit der Reflexion?
Jede Beratung geschätzt!
Andrew
Bearbeiten
Die andere mögliche Idee, die ich hat war, produzieren eine partielle Klasse mit dem override-Funktion, aber das schien nicht machbar entweder.
- Frage mich, ob eine interceptor-basierten Ansatz würde die Arbeit hier - so etwas wie Schloss DynamicProxy: castleproject.org/projects/dynamicproxy - natürlich wäre Sie nicht vollständig ersetzen, die Methode aufrufen, aber das könnte man sicherlich abfangen/Fehler behandeln und optimieren (ach ja, und es hängt davon ab, ob die Klasse über virtuelle Methoden)
- Warum nicht einfach eine Klasse, als Sie sagte, dass die Anrufe der Dritten Klasse für die meisten Dinge, außer die Methode, die Sie überschreiben möchten? Oder leiten Sie von dieser Klasse und verwenden Sie einen anderen Namen für diese Methode? Auch brauchen Sie wirklich, dass in 1 einzigartige dll? Warum nicht aufteilen in 2?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie überschreiben die Methode, nur wenn es virtuell ist, und es ist egal, ob du es durch Reflexion oder statisch. Ich würde vorschlagen, mit einem decompiler (es gibt eine Menge von frei verfügbaren) und fixieren Sie den code in MSIL. Dann erzeugen Sie eine neue Baugruppe aus dem MSIL.
api
, wie Sie sehen können in dem code, den Sie zusammengestellt haben, eshttps://api.mailgun.net/v2/
version 2 der api-ich will es ändern, um version 3https://api.mailgun.net/v3/
, was kann getan werden ?Ich glaube, dass Ihre erste Idee ist gut.
Wenn die Dritte Klasse nicht
sealed
Sie daraus ableiten, und fügen Sie Ihre eigene Methode, mit einem anderen Namen, korrigieren Sie das Verhalten, das falsch ist.Wenn Sie es brauchen, um in 1 dll, die Sie verwenden können,IlMerge.
Wenn Ihr Dritter Klasse versiegelt ist, können Sie nur eine Instanz haben, die der Dritten Klasse in die neue Klasse und nennen Sie die Methoden, wenn nötig.
Aber Sie haben zu prüfen, dass die Methode, die Sie wollen, zu "überschreiben" ist nicht aufgerufen, in die Bibliothek, weil, wenn es diese Lösung nicht funktioniert...
Es ist nicht sehr sauber, aber es kann eine vorübergehende Lösung während der Zeit der Firma, die Bearbeitungen der Bibliothek behebt das problem.
Ist und wenn es behoben, würden Sie müssen nur zum umbenennen der Methode, die Sie verwenden, damit es nicht zu zeitaufwendig sein.
Aus, was Sie beschrieben haben, würde ich empfehlen, eine änderung der ursprünglichen assembly. Der Prozess ist im wesentlichen
Aus, was ich sehen kann Reflexil ermöglicht es Ihnen, genau das zu tun, obwohl es möglicherweise erforderlich, dass Sie kaufen Resharper (ich habe nicht selber ausprobiert)
Alternativ können Sie ILDasm zu dekompilieren der gesamten Montage in eine einzelne Datei, ändern Sie die Datei und kompilieren Sie es mit ILAsm
Ich weiß, ich komme ein bisschen spät, aber ich würde Zustimmen Charleh; wenn du hast eine Klasse, die nicht Verhalten gut und ist nicht förderlich für die substitution, aber zumindest erklärt, seine Methoden als
virtual
, dann sind Sie im Glück. Im folgenden sind die Referenzen zuCastle.Core
undPatterns
:Habe ich auch die Freiheit genommen, von der Bereitstellung eine laufende Beispiel dieser in LinqPad. Es zeigt den Unterschied zwischen Methoden, die es ermöglichen, abfangen (
virtual
), und diejenigen, die nicht. Es zeigt auch eine nützliche Möglichkeit, abfangen von Ausnahmen, ohne den code mitTry.Do
ausPatterns
.