Где бы вы использовали компиляцию во время выполнения C #?

StackOverflow https://stackoverflow.com/questions/143973

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Что ж, весь код C # компилируется во время выполнения, поскольку это JIT-компилятор (just-in-time).Я предполагаю, что вы имеете в виду отражение.Испускать для создания классов и т.д.на лету.Вот пример, который я недавно видел в библиотеке Xml-Rpc.Net.

Я создаю интерфейс C #, который имеет ту же сигнатуру, что и вызовы методов службы 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 для меня.Довольно круто.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top