Muß ich meine eigene unmanaged IL-Bibliothek schreiben IL neu zu schreiben mit dem CLR Profilerstellungs-API?

StackOverflow https://stackoverflow.com/questions/2269844

Frage

Ich habe für die CLR Profilerstellungs-API auf einige der Artikel suchen, und viele dieser Artikel sprechen über SetILFunctionBody () aufrufen Umschreiben der tatsächlichen IL zu tun; jedoch keiner dieser Artikel erklärt, eigentlich genau das, was Sie verwenden könnten die tatsächliche Methode IL-Bytes neu zu schreiben. Gibt es eine nicht verwaltete Bibliothek gibt, die mich IL schreiben können, oder hätte ich selber ein schreiben?

War es hilfreich?

Lösung

Wahrscheinlich. Es hängt davon ab.

Das Mono-Projekt hat eine Bibliothek namens Cecil, die Sie hier zugreifen können:

http://mono-project.com/Cecil

Allerdings ist es verwalteten Code, die Sie nicht aufrufen können, während Profilierung. Möglicherweise haben Sie ein ein paar Optionen aber:

  1. Verwenden Sie IPC. Sie könnten einen neuen Prozess erzeugen, das Umschreiben mit cecil in diesem Prozess zu tun und dann passieren die Verwendung von Named Pipes zurück zu Ihrem Profiler-Bytes.
  2. Port CECIL zu C ++. Die verteilte den Code unter der Lizenz MIT / X11, so können Sie dies tun, ohne die Änderungen teilen zu müssen.
  3. Sie Ihre eigenen Sachen von Grund auf neu schreiben.

# 1 führt eine Reihe von zusätzlicher Komplexität. Ihr Profiler würde am Ende mehr mit beweglichen Teilen, als es wirklich gebraucht wird. Außerdem führt der IPC eine Reihe von zusätzlichen Overhead.

# 2 würde eine lange Zeit in Anspruch nehmen. Da Cecil ist nach wie vor nur in der Version 0.6, ist es vielleicht nicht die Zeit wert sein, es zu tun, gegen Ihre eigene Implementierung zu schreiben.

# 3 würden Sie die größtmögliche Kontrolle und würde wahrscheinlich die performant sein. Allerdings wäre es wesentlich mehr Mühe, als # 1 würde.

Andere Tipps

schrieb ich eine einfache Entscheidung für OpenCover https://github.com/sawilde/opencover die Sie oder jemand anderes für diese Angelegenheit kann nützlich finden

kann dieser Artikel, was Sie suchen http://www.codeproject.com/KB/cs/IL_Rewriting.aspx

Das tatsächliche Bytes hat von irgendwoher kommen, und wenn Sie nur den Profilerstellungs-API verwenden, dann müssen Sie sie selbst zur Verfügung stellen. Dieser Artikel geht in die Tiefe, wie es (wahrscheinlich einer von denen Sie gelesen haben) zu tun: http://msdn.microsoft.com/en-us/magazine/cc188743.aspx

Eine ‚gemeinsame‘ Technik ist, um tatsächlich schreiben, was Code, den Sie in benötigen welcher Sprache Sie bevorzugen und dann kompilieren sie IL. Anschließend können Sie extrahieren entweder die OpCodes zur Entwurfszeit und sie speichern, wo Sie sie erreichen können oder sie von der kompilierten IL zur Laufzeit extrahieren und sie stopfen, wo Sie es brauchen.

AFAIK gibt es keine nicht verwalteten Bibliotheken, die Sie mit diesem helfen.

Ich nehme an, Sie wollen, dies zu tun, weil Sie wollen, um zu sehen, was die Zeit nehmen, damit Sie sie schneller gehen machen können (im Gegensatz zu nur verschiedenem Timing info bekommen). IMHO, Sie die Profilierungs API nicht benötigen, wenn Sie Ihre Anwendung unter einer IDE ausführen können und sie zufällig pausieren. Hier ist der Grund.

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