2010-05-02 3 views
9

Ich möchte etwas Verhalten zu einer bestimmten Klasse zur Laufzeit hinzufügen. Ich weiß, wie man mit Reflection.Emit zur Laufzeit Unterklassen bildet, aber das ist nicht genug. Abhängig von irgendeiner externen Konfiguration muss ich Opcodes in eine Methode auf einem Typ T injizieren, so dass alle Klassen, die von ihr erben, automatisch dieses Verhalten bekommen .NET Profiling API)Kann Mono.Cecil Code ändern, der bereits in der AppDomain geladen wurde?

Kann so etwas mit Mono.Cecil gemacht werden?

Wenn es nicht möglich ist, Code auf einer geladenen Assembly zu ändern, ist es in Ordnung, wenn ich die Änderungen vornehmen kann, bevor die Assembly geladen wird, und laden Sie dann die geänderte Assembly im Speicher, aber ich weiß nicht, wie ich Assembly laden steuern kann.

+0

Fragen Sie, weil Sie den Code optimieren möchten? Sind Sie offen für die Idee der Probenahme als Alternative zur Instrumentierung? Viele Menschen glauben an Instrumentierung, weil es "genau" ist, was nicht für die Optimierung benötigt wird. Wenn Sie optimieren möchten, betrachten Sie diese Methode: http://stackoverflow.com/questions/375913/what-cani-i-use-to-profile-c-code-in-linux/378024#378024 –

+0

Seine nicht Optimierung Ich suche, was ich will, ist, ein Verhalten zu einem Framework basierend auf der Konfiguration hinzuzufügen. Nehmen wir zum Beispiel den TypeDescriptor-Inspektions-Mechanismus, wenn ich eine Konfiguration lese und eine öffentliche Eigenschaft zu einer Basisklasse T hinzufüge, dann sieht derjenige, der T oder eine seiner Unterklassen mit dem TypeDescriptor-Mechanismus untersucht, die Eigenschaft, aber wenn dieselbe Inspektion durchgeführt wird Bei der Reflektion fehlt die Eigenschaft. Das ist, weil der Typ nicht tatsächlich geändert wird, die Eigenschaft nur in dem Kontext der TypeDescriptor-Überprüfung hinzugefügt wird. –

Antwort

6

Nein, Cecil kann eine geladene Baugruppe nicht ändern. Sie müssen Baugruppen assemblieren, bevor sie tatsächlich geladen werden.

Sie haben nicht viel Kontrolle darüber, wie Baugruppen aufgelöst werden. Sie können sich in AppDomain.AssemblyResolve einklinken, wenn Sie die Assemblys in einem privaten Ordner von Ihnen und dann vor dem Laden des Geräts ausblenden.

+0

Das ist was ich brauche, ich wusste nichts über diese Veranstaltung, danke. –

1

Wie JB oben erwähnt Sie können eine Resolve Event-Handler erstellen - das wäre wie PSeudoHooking. Und bevor die Assembly geladen wird, nehmen Sie Ihre Änderungen vor. Sobald die Änderungen abgeschlossen sind, fährt die Resolve Assembly mit dem Laden der geänderten Assembly fort.

Ich verwende diese Methode zum Auflösen von Embedded Dll aus Memory Streams.

Verwandte Themen