2013-07-30 4 views
4

Я работаю в кодовой базе, которая довольно большая, и сегодня я нашел проект, который излучал IL code внутри нормального class.Зачем вам нужно испускать код IL?

Проект, содержащий испускаемый IL-код, представляет собой реализацию Service LocatorMSDN Desctiption.

Каковы преимущества делают это и почему бы это быть сделано как соединенный с использованием C# языка?

+1

Зависит ... Что сделал код IL? – Belogix

+0

Мое понимание ИЛ в крайне ограниченных, так что не знаю. – ojhawkins

+3

И * это * является одной из самых больших проблем с испусканием ИЛ. Это требует больших знаний, которых нет у обычного программиста, просто чтобы прочитать код впоследствии, и даже если у вас есть эти знания, его все еще трудно читать. –

ответ

12

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

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

Преимущества:

  • Производительность

Недостатки:

  • Трудно отлаживать
  • Трудно получить право
  • Трудно прочитать код после
  • Крутая кривая обучения

Поэтому вам нужно убедиться, что это действительно стоит того, прежде чем приступать к этому.

Обратите внимание, что это общий ответ. В конкретном случае, с которым вы столкнулись, нет способа ответить, почему это было сделано, и каких конкретных преимуществ (или недостатков) у вас было бы без фактического просмотра кода.

+0

Это было в реализации локатора сервисов, так что была бы частью отражения, которую я считаю – ojhawkins

+0

Возможно.Я сам это сделал, реализовал контейнер IoC, который испускает IL для построения графиков объектов. Рамочный код, может быть, ОК, код уровня приложения, вероятно, нет. –

+3

Вы можете часто получать производительность без многих других проблем, используя деревья выражений. Например, методы ['ObjectModelAdaptor.BuildAccessor'] (https://github.com/antlr/antlrcs/blob/master/Antlr4.StringTemplate/Misc/ObjectModelAdaptor.cs) генерируют код во время выполнения, но ни один из них явно не постройте последовательности операций кода IL. Эта стратегия также полностью устранила ошибки, которые мы попали во время первоначального тестирования из-за различий в обработке между ссылочными типами и типами значений. –

2

Для этого есть много применений.
Одним из наиболее часто используется сценарий для изменения/внедрения кода на лету:
.NET CLR Injection: Modify IL Code during Run-time


Хороший учебник, который поможет мне понять, хорошо использовать для него: Dynamic... But Fast: The Tale of Three Monkeys, A Wolf and the DynamicMethod and ILGenerator Classes


Удача

Смежные вопросы