Где бы вы использовали С# Runtime Compilation?

Недавно я недавно познакомился с другим сайтом о компиляции С# во время поиска чего-то еще и подумал, что идея интересна. Вы когда-нибудь использовали это? Я пытаюсь определить, как/когда можно использовать это и какую проблему он решает. Мне было бы очень интересно узнать, как вы его использовали или в каком контексте это имеет смысл.

Большое спасибо.

Ответ 1

Как правило, я вижу, что это используется в тех случаях, когда вы используете Reflection и вам нужно оптимизировать производительность.

Например, вместо использования метода отражения для вызова X вы создаете динамический метод во время выполнения, чтобы сделать это для вас.

Ответ 2

Вы можете использовать это, чтобы добавить поддержку скриптов в ваше приложение. Для примера посмотрите здесь или здесь.

Довольно легко можно публиковать части своей внутренней структуры объектов для части скриптов, поэтому вы можете с относительной легкостью добавить что-то в свое приложение, которое имеет такой же эффект, как, например, VBA для Office.

Ответ 3

Я видел это (компиляция/использование во время выполнения классов System.Reflection.Emit) при создании динамических прокси (Пример проекта кода) или другие средства оптимизации вызовов отражения (по времени).

Ответ 4

Как минимум один случай, который вы можете использовать, - это генерация динамического кода. Например, инфраструктура использует это внутренне для генерации XML-сериализаторов "на лету". Изучив класс во время выполнения, он может генерировать код для сериализации/десериализации класса. Затем он компилирует этот код и использует его по мере необходимости. Таким же образом вы можете сгенерировать код для обработки произвольных таблиц DB и т.д., А затем скомпилировать и загрузить созданную сборку.

Ответ 5

Ну, весь код С# компилируется во время выполнения, так как это компилятор JIT (точно в момент времени). Я предполагаю, что вы имеете в виду Reflection.Emit для создания классов и т.д. На лету. Вот пример, который я недавно видел в библиотеке Xml-Rpc.Net.

Я создаю интерфейс С#, который имеет ту же подпись, что и вызов метода службы XML-RPC, например

IMyProxy : IXmlRpcProxy
{
    [XmlRpcMethod]
    int Add(int a, int b);
}

Тогда в моем коде я вызываю что-то вроде

IMyProxy proxy = (IMyProxy)XmlRcpFactory.Create(typeof(IMyProxy));

Это использует генерацию кода времени выполнения для создания полностью функционального прокси для меня, поэтому я могу использовать его следующим образом:

int result = proxy.Add(1, 2);

Затем это обрабатывает вызов XML-RPC для меня. Довольно круто.

Ответ 6

Я использовал службы компилятора во время выполнения из .NET в своей дипломной работе. В основном, это было визуальное создание некоторого графического компонента для визуализации процесса, который генерируется как код С#, скомпилированный в сборку и затем может быть использован в целевой системе без интерпретации, чтобы сделать ее более быстрой и компактной. И, в качестве бонуса, сгенерированные изображения могут быть упакованы в ту же самую сборку, что и ресурсы.

Другое использование этого было в Java. У меня было приложение, которое должно было построить потенциально дорогостоящую функцию, используя некоторый численный алгоритм (вернулся в университет), который пользователь мог ввести. Я поместил введенную функцию в класс, скомпилировал и загрузил ее, и тогда она была доступна для относительно быстрого выполнения.

Итак, это мои два опыта, когда генерация кода времени исполнения была хорошей.

Ответ 7

то, что я использовал для этого, было для того, чтобы код С# и VB был запущен пользователем ad-hoc. Они могут вводить строку кода (или пару строк), и она будет скомпилирована, загружена в домен приложения и выполнена, а затем выгружена. Это, вероятно, не лучший пример его использования, но пример этого не менее