Я должен записать свою собственную неуправляемую библиотеку IL для перезаписи IL с CLR Профильный API?

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

7
задан valiano 26 February 2019 в 18:40
поделиться

4 ответа

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

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

http://mono-project.com/Cecil

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

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

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

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

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

3
ответ дан 7 December 2019 в 12:19
поделиться

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

1
ответ дан 7 December 2019 в 12:19
поделиться

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

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

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

0
ответ дан 7 December 2019 в 12:19
поделиться

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

-1
ответ дан 7 December 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: