Нужно ли мне писать собственную неуправляемую библиотеку IL для перезаписи IL с помощью API профилирования CLR? - PullRequest
7 голосов
/ 16 февраля 2010

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

Ответы [ 5 ]

3 голосов
/ 21 февраля 2010

Возможно. Это зависит.

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

http://mono -project.com / Cecil

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

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

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

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

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

2 голосов
/ 22 июня 2011

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

1 голос
/ 19 февраля 2010

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

0 голосов
/ 19 февраля 2010

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

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

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

0 голосов
/ 18 февраля 2010

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

...