Создание IL для платформы .Net

Я пишу небольшой компилятор на C# и планирую генерировать инструкции IL для платформы .Net, используя System.Reflection.Emit. Мой вопрос в том, что рекомендуется использовать System.Reflection.Emit для создания IL для производственных компиляторов.

Если не рекомендуется использовать System.Reflection.Emit для создания IL для производственных компиляторов, есть ли у нас альтернативные библиотеки/инструменты для этой цели?


person Upul Bandara    schedule 01.06.2011    source источник


Ответы (4)


System.Reflection.Emit подходит для производственных компиляторов, хотя вы можете взглянуть на mono-cecil.

person Oded    schedule 01.06.2011
comment
+1. Microsoft.CCI также является опцией. Кажется, что производительность является важным фактором в этой библиотеке (одним из примеров являются явные таблицы имен), поэтому это может позволить вам сделать более быстрый компилятор. Но в моем ограниченном использовании я предпочитал API Сесила. - person Merlyn Morgan-Graham; 01.06.2011

Вот статья в блоге, описывающая некоторые проблемы с Reflection.Emit, которые, вероятно, не являются серьезными ограничениями для вашего проекта, но вам решать:

Если эти проблемы вас не беспокоят, вы можете использовать этот вопрос SO для получения советов по генерации с использованием Reflection.Emit и записи сборки на диск:

person Rick Sladkey    schedule 01.06.2011

Хотя System.Reflection.Emit позволяет вам выполнять генерацию кода, это самый старый из API-интерфейсов генерации кода в среде .NET, и он требует понимания IL. Деревья выражений, представленные в .NET 3.5 и расширенные в .NET 4.0 (не могут создавать новые типы), но их можно использовать для сборки полных тел методов.

person John Leidegren    schedule 01.06.2011

Reflection.Emit обычно подходит, но IKVM.Reflection.Emit (доступен в Mono) может иметь больше параметров, если создаваемая вами сборка не для той же платформы (т. е. вы хотите создать dll Silverlight из своего компилятора, который написано на "полном" .NET).

person Marc Gravell    schedule 01.06.2011
comment
Моно прекрасен во всех смыслах. Они создают множество интересных вещей, о которых должен знать каждый разработчик .NET. Я не знал о IKVM. - person John Leidegren; 01.06.2011