Генерация динамического кода из строки с помощью Reflection.Emit

Я сохранил код C# в таблице базы данных.

У меня есть весь код базового класса в строке.

Имея в руках сохраненный код C#, я добавляю в класс метод с именем m1 который содержит return <<some C# code>>; (метод всегда возвращает object поэтому код C# может быть: 88 + 90, "hello world", this.ToString()и т. д.), сохраните его в файл и скомпилируйте с CSharpCodeProviderи запустите его в моей программе.

Сохраненный код C# может использовать некоторые методы в базовом классе.

Эта схема работает очень хорошо.

Теперь я бы использовать Reflection.Emit сделать это, чтобы избежать шага компиляции.

Возможно ли это, и если да, то как это будет сделано?

1 ответ

Теперь я бы использовать Reflection.Emit сделать это, чтобы избежать шага компиляции.

Это не имеет особого смысла для меня. Если у вас есть исходный код, который вы хотите выполнить, у вас есть два варианта:

  1. Скомпилируйте его в другую форму, которая затем может быть выполнена напрямую. (Классические скомпилированные языки, такие как C, работают следующим образом.)
  2. Разобрать его в некоторую структуру в памяти, а затем выполнить это, шаг за шагом. (Классические интерпретируемые языки работают так же, как JavaScript в старых браузерах.)

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

Если вы не хотите использовать CodeDOM, у вас останется два варианта (в соответствии с двумя вариантами выше):

  1. Разобрать код, а затем создать из него некоторую исполняемую форму, возможно, используя Reflection.Emit,
  2. Разбираем код и напрямую выполняем результат. Вам не нужно Reflection.Emit для этого.

Вариант 1 означает, что вам нужно будет реализовать полный компилятор C#. Вариант 2 означает, что вам потребуется реализовать половину компилятора C# и интерпретатор вашей структуры в памяти. В обоих случаях это был бы гигантский проект, и вы бы на самом деле не "избегали этапа компиляции".

Другие вопросы по тегам