Генерация динамического кода из строки с помощью Reflection.Emit
Я сохранил код C# в таблице базы данных.
У меня есть весь код базового класса в строке.
Имея в руках сохраненный код C#, я добавляю в класс метод с именем m1
который содержит return <<some C# code>>;
(метод всегда возвращает object
поэтому код C# может быть: 88 + 90
, "hello world"
, this.ToString()
и т. д.), сохраните его в файл и скомпилируйте с CSharpCodeProvider
и запустите его в моей программе.
Сохраненный код C# может использовать некоторые методы в базовом классе.
Эта схема работает очень хорошо.
Теперь я бы использовать Reflection.Emit
сделать это, чтобы избежать шага компиляции.
Возможно ли это, и если да, то как это будет сделано?
1 ответ
Теперь я бы использовать
Reflection.Emit
сделать это, чтобы избежать шага компиляции.
Это не имеет особого смысла для меня. Если у вас есть исходный код, который вы хотите выполнить, у вас есть два варианта:
- Скомпилируйте его в другую форму, которая затем может быть выполнена напрямую. (Классические скомпилированные языки, такие как C, работают следующим образом.)
- Разобрать его в некоторую структуру в памяти, а затем выполнить это, шаг за шагом. (Классические интерпретируемые языки работают так же, как JavaScript в старых браузерах.)
На самом деле все не так просто, как в наши дни, из-за виртуальных машин, промежуточных языков и т. Д., Но это основной выбор.
Если вы не хотите использовать CodeDOM, у вас останется два варианта (в соответствии с двумя вариантами выше):
- Разобрать код, а затем создать из него некоторую исполняемую форму, возможно, используя
Reflection.Emit
, - Разбираем код и напрямую выполняем результат. Вам не нужно
Reflection.Emit
для этого.
Вариант 1 означает, что вам нужно будет реализовать полный компилятор C#. Вариант 2 означает, что вам потребуется реализовать половину компилятора C# и интерпретатор вашей структуры в памяти. В обоих случаях это был бы гигантский проект, и вы бы на самом деле не "избегали этапа компиляции".