Нужно ли мне писать собственную неуправляемую библиотеку IL, чтобы переписать IL с помощью API профилирования CLR?

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

Вопрос

Я просматривал некоторые статьи об API профилирования CLR, и во многих из них говорится о вызове SetILFunctionBody() для фактической перезаписи IL;однако ни одна из этих статей на самом деле не объясняет, что именно можно использовать, чтобы переписать фактические байты IL метода.Существует ли неуправляемая библиотека, позволяющая мне писать IL, или мне придется писать ее самому?

Это было полезно?

Решение

Вероятно.Это зависит.

В Mono Project есть библиотека Cecil, доступ к которой вы можете получить здесь:

http://mono-project.com/Сесил

Однако это управляемый код, который нельзя вызывать во время профилирования.Хотя у вас может быть несколько вариантов:

  1. Используйте МПК.Вы можете создать новый процесс, переписав его с помощью cecil, а затем передать байты обратно в профилировщик, используя именованные каналы.
  2. Перенесите CECIL на C++.Код распространяется по лицензии MIT/X11, поэтому вы можете делать это без необходимости делиться своими изменениями.
  3. Просто напишите свой собственный материал с нуля.

№1 представляет собой дополнительную сложность.В конечном итоге ваш профилировщик будет иметь больше движущихся частей, чем это действительно необходимо.Кроме того, IPC приводит к множеству дополнительных накладных расходов.

№2 займет много времени.Учитывая, что у Cecil все еще только версия 0.6, возможно, не стоит тратить на это время, а не на написание собственной реализации.

№3 даст вам максимальную степень контроля и, вероятно, будет наиболее производительным.Однако это потребует значительно больше усилий, чем вариант №1.

Другие советы

Я написал простой для OpenCover https://github.com/sawilde/opencover которые вы или кто-либо другой в этом отношении могут найти полезными

В этой статье может быть то, что вы ищетеhttp://www.codeproject.com/KB/cs/IL_Rewriting.aspx

Фактические байты должны откуда-то поступать, и если вы просто используете API профилирования, вы должны предоставить их самостоятельно.В этой статье подробно о том, как это сделать (вероятно, одна из тех, которые вы читали): http://msdn.microsoft.com/en-us/magazine/cc188743.aspx

Более «распространенный» метод — написать любой код, который вам нужен, на любом языке, который вы предпочитаете, а затем скомпилировать его в IL.Затем вы можете либо извлечь коды операций во время разработки и сохранить их там, где вы сможете их получить, либо извлечь их из скомпилированного IL во время выполнения и разместить там, где вам это нужно.

AFAIK нет неуправляемых библиотек, которые могли бы помочь вам в этом.

Я предполагаю, что вы хотите сделать это, потому что хотите увидеть, что занимает время, чтобы вы могли ускорить его (а не просто получать различную информацию о времени).ИМХО, вам не нужен API профилирования, если вы можете запустить свое приложение в IDE и приостановить его в произвольном порядке. Вот почему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top