Ändern Bestehender .NET-Assemblys
Gibt es eine Möglichkeit, vorhandene ändern .NET-assemblies, ohne auf 3rd-party-tools? Ich weiß, dass PostSharp macht dies möglich, aber ich finde es unglaublich verschwenderisch, dass die developler von PostSharp im Grunde hatte zu schreiben, die die Funktionalität des ganzen System.Reflection
- namespace, um bestehende Baugruppen modifizierbar.
System.Reflection.Emit
erlaubt nur die Erstellung von neuen, dynamischen Assemblys. Allerdings, alle die builder-Klassen, die hier Erben von der grundlegenden Reflexion Klassen (z.B. TypeBuilder
erbt von System.Type
). Leider, es scheint nicht zu sein, einen Weg zu zwingen, eine bestehende, dynamisch geladen wird, geben Sie in eine Art generator. Zumindest gibt es keine offizielle, unterstützt.
So was von nicht unterstützten? Weiß jemand von backdoors, die es ermöglichen, laden Sie vorhandene Baugruppen oder Arten, die in solchen builder-Klassen?
Geist, ich bin nicht der Suche nach Möglichkeiten zum ändern der aktuellen Baugruppe (diese kann sogar eine unzumutbare Anforderung), aber nur um das ändern vorhandener Baugruppen geladen von der Disk. Ich fürchte, es gibt keine solche Sache, aber ich möchte Sie trotzdem bitten.
Im schlimmsten Fall würde, zu greifen, zu ildasm.exe
demontieren Sie den code und dann ilasm.exe
für den Zusammenbau, aber es gibt keine toolchain (lies: IL-reader) enthalten in .NET für die Arbeit mit IL-Daten (oder doch?).
/EDIT:
Ich hab keinen bestimmten Fall. Ich bin nur daran interessiert, eine Allgemeine Lösung, weil patchen von vorhandenen Baugruppen ist eine Recht häufige Aufgabe. Nehmen obfuscators zum Beispiel, oder der Profiler, oder AOP-Bibliotheken (ja, das letztere kann werden anders implementiert). Wie ich schon sagte, es scheint unglaublich verschwenderisch gezwungen werden, zu umschreiben, große Teile der bereits vorhandenen Infrastruktur in System.Reflection
.
@Wedge:
Du hast Recht. Es gibt jedoch keine spezifischen Anwendungsfall hier. Ich habe geändert, die ursprüngliche Frage, um diese zu reflektieren. Mein Interesse wurde geweckt durch eine andere Frage, wo der Fragesteller wollte wissen, wie er könnte, Spritzen Sie den Anweisungen pop
und ret
am Ende jeder Methode, um zu halten von Lutz Roeder ' s Reflector von reengineering the (VB oder C#) - Quellcode.
Nun, dieses Szenario kann umgesetzt werden mit einer Reihe von tools, z.B. PostSharp erwähnt und die Reflexil plugin für den Reflektor, der wiederum verwendet die Cecil Bibliothek.
Alles in allem, ich bin einfach nicht zufrieden mit der .NET framework.
@Joel:
Ja, ich bin mir bewusst, dass dieser Beschränkung. Trotzdem danke für den Hinweis es aus, da es wichtig ist.
@marxidad:
Dies scheint der einzige praktikable Ansatz. Dies würde jedoch bedeuten, dass Sie würden immer noch neu die komplette Baugruppe mit den builder-Klassen, richtig? I. e. würden Sie haben zu gehen über die ganze Versammlung manuell.
Hmm, ich werde in diesem Blick.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie MethodInfo.GetMethodBody().GetILAsByteArray(), ändern Sie Sie, und dann schließen Sie es wieder in MethodBuilder.CreateMethodBody().
Mono.Cecil können Sie auch entfernen Sie den starken Namen, der aus einer bestimmten Baugruppe und speichern Sie es als eine nicht signierte assembly. Sobald Sie entfernen den starken Namen, der von der Versammlung, Sie können ändern Sie einfach die IL Ihr Ziel, Methode und nutzen der Versammlung wie jede andere Montage. Hier ist der link für das entfernen von starken Namen mit Cecil:
http://groups.google.com/group/mono-cecil/browse_thread/thread/3cc4ac0038c99380/b8ee62b03b56715d?lnk=gst&q=strong+named#b8ee62b03b56715d
Sobald Sie entfernt haben die starken Namen, Sie können ziemlich viel tun, was Sie wollen mit der Montage. Genießen Sie!
Würde es helfen, wenn Sie könnten, bieten einen bestimmten Fall, gibt es wahrscheinlich bessere Wege, um Ihr problem zu beheben als das.
In .NET 3.5 ist es möglich, hinzufügen von extension-Methoden zu vorhandenen framework-Klassen, vielleicht ist das genug?
Einen wichtigen Punkt: wenn Sie die assembly ist unterzeichnet, alle änderungen werden scheitern und werden Sie am Ende mit ein Blindgänger.
.NET Framework-Assemblys sind signiert und nur als Joel sagte Coehoorn erhalten Sie ein Blindgänger.
Könnten Sie laden Sie die Montage mit IronRuby und mixin alle Funktionen, die Sie von träumen können