Где бы вы использовали C # Runtime Compilation? - PullRequest
11 голосов
/ 27 сентября 2008

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

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

Ответы [ 7 ]

7 голосов
/ 27 сентября 2008

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

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

5 голосов
/ 27 сентября 2008

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

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

3 голосов
/ 28 сентября 2008

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

2 голосов
/ 27 сентября 2008

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

2 голосов
/ 27 сентября 2008

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

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

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

2 голосов
/ 27 сентября 2008

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

2 голосов
/ 27 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...