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:
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
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.
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.
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.
Nach dem, was Sie beschrieben haben, würde ich empfehlen, die ursprüngliche Baugruppe zu ändern. Der Prozess ist im Wesentlichen
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
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
.
Tags und Links c# dll reflection