Frage

Gibt es eine Möglichkeit bestehende .NET-Assemblies zu modifizieren, ohne Werkzeuge zu 3rd-Party zurückgreifen? Ich weiß, dass Postsharp macht dies möglich, aber ich finde es unglaublich verschwenderisch, dass die developler von Postsharp im Grunde die Funktionalität neu zu schreiben hatten des gesamten System.Reflection Namensraum, um bestehende Baugruppen veränderbar zu machen.

System.Reflection.Emit erlaubt nur die Schaffung von neuen, dynamischen Baugruppen. Allerdings sind alle Builder-Klassen hier erben von den Basis-Reflexionsklassen (z TypeBuilder erbt von System.Type). Leider scheint es keine Möglichkeit zu zwingen, einen bestehenden, dynamisch geladenen Typen in einen Typ-Builder zu sein. Zumindest ist es keine offizielle unterstützte Art und Weise.

Was ist also nicht unterstützt? Kennt jemand von Backdoors, die laden bestehenden Baugruppen oder Arten in eine solche Builder-Klassen erlauben?

Geist, ich bin nicht Suche nach Möglichkeiten, die aktuelle Anordnung zu ändern (dies kann auch eine unzumutbare Anforderung sein), sondern nur bestehende Baugruppen von Platte geladen zu ändern. Ich fürchte, es gibt nicht so etwas, aber ich möchte auf jeden Fall fragen.

Im schlimmsten Fall würde man zurückgreifen müssen ildasm.exe den Code zu zerlegen und dann für den Wiedereinbau ilasm.exe aber es gibt keine Toolchain (sprich: IL Leser) (? Oder ist es) in .NET enthalten ist, mit IL-Daten zu arbeiten .

/ EDIT:

Ich habe keinen spezifischen Anwendungsfall bekommt. Ich bin nur daran interessiert in einer Mehrzwecklösung, da die Patchen bestehende Baugruppen eine ziemlich gemeinsame Aufgabe ist. Nehmen Sie obfuscators zum Beispiel, oder Profilometer oder AOP Bibliotheken (ja, diese können unterschiedlich implementiert werden). Wie ich gesagt habe, ist es unglaublich verschwenderisch scheint gezwungen zu werden, große Teile der bereits vorhandenen Infrastruktur in System.Reflection neu zu schreiben.


@Wedge:

Sie haben Recht. Allerdings gibt es keinen speziellen Anwendungsfall hier. Ich habe die ursprüngliche Frage geändert, dies zu reflektieren. Mein Interesse durch eine andere Frage ausgelöst wurde, wo die Fragesteller wissen wollten, wie er die Anweisungen pop und ret am Ende jeder Methode, um Lutz Roeder Reflektor zu halten von Reengineering das (VB oder C #) Quellcode injizieren könnte.

Jetzt kann dieses Szenario mit einer Reihe von Werkzeugen realisiert werden, z.B. Postsharp oben erwähnt, und die REFLEXIL Plugin für Reflektor, das wiederum verwendet die Cecil Bibliothek.

Alles in allem, ich bin einfach nicht zufrieden mit dem .NET-Framework.

@ Joel:

Ja, ich bin mir dessen bewusst diese Einschränkung. Danke trotzdem für sie unter Hinweis darauf, da es wichtig ist.

@marxidad:

Dies scheint der einzig gangbare Ansatz. Allerdings würde dies bedeuten, dass Sie immer noch die komplette Baugruppe mit den Builder-Klassen neu erstellen müssen, nicht wahr? D. h Sie würden manuell über die ganze Versammlung zu gehen haben.

Hmm, ich werde in diesem Blick.

War es hilfreich?

Lösung

Sie können MethodInfo.GetMethodBody (). GetILAsByteArray () , modifizieren, dass, und stecken Sie es dann wieder in MethodBuilder.CreateMethodBody () .

Andere Tipps

Mono.Cecil können Sie auch den starken Namen aus einer bestimmten Anordnung entfernen und speichern Sie es als eine nicht signierte Baugruppe zurück. Sobald Sie den starken Namen aus der Baugruppe entfernen, können Sie nur die IL Ihrer Zielmethode ändern und die Montage wie jede andere Assembly verwenden. Hier ist der Link für den starken Namen mit Cecil Entfernung:

http: //groups.google.com/group/mono-cecil/browse_thread/thread/3cc4ac0038c99380/b8ee62b03b56715d?lnk=gst&q=strong+named#b8ee62b03b56715d

Wenn Sie den starken Namen entfernt haben, können Sie ziemlich viel tun, was Sie mit der Montage werden soll. Genießen Sie!

Es würde helfen, wenn Sie präzisen Anwendungsfall bieten könnten, gibt es wahrscheinlich bessere Möglichkeiten, um Ihr Problem als dies zu beheben.

In .NET 3.5 ist es möglich, Erweiterungsmethoden bestehenden Rahmen Klassen hinzuzufügen, vielleicht ist das genug?

Ein wichtiger Punkt:., Wenn die Montage ist unterzeichnet , werden alle Änderungen fehlschlagen, und Sie werden mit einem Blindgänger am Ende

.NET Framework-Assemblys unterzeichnet ist und wie Joel Coehoorn sagte Du einen Blindgänger erhalten.

Sie können die Baugruppe mit IronRuby laden und mixin die alle Funktionen, die Sie träumen von können

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top