Использование CodeDom в качестве скриптового «интерпретатора»

Есть такая технология в .NET, CodeDom, которая позволяет собирать вместе код написанный на C#, VB, ASP и т.п.
Есть у CodeDom еще и такая возможность, как компиляция кода на лету из строки. Вот эта возможность и позволяет использовать его в качестве «скрипта». Почему в кавычках? Дело в том, что код из строки компилируется, а потом запускается. По-умолчанию компилируется в dll файл в папке Temp. Там, вроде, можно задать компиляцию в память. Но с этим я не разбирался.
И так. Часть первая. Создаем простой проект на C#.


Здесь все просто. По клику на форме вылезет сообщение. На самом деле можно было не указывать полный путь к MessageBox, но мы его перенесем в скрипт, а там надо либо использовать using и класс создавать, либо, если нам нужен простой вариант скрипта, использовать полные пути (ну или все using’и прописывать в вызывающем коде).
Первое, что нам понадобится, это: функция компиляции, функция получения экземпляра класса для кода скрипта и интерфейс этого класса, для того, чтобы наша программа могла взаимодействовать со скриптом.

В исходном коде функции компиляции присутствует такая строчка:

Если задать true, то компилятор не будет удалять временные файлы. Если при компиляции или выполнении «скрипта» будут ошибки то они отобразятся в файле #####.err или #####.out, полный исходный код который подвергался компиляции будет в файле: #####.0.cs. вместо ##### будет случайный набор символов.
Я не заморачивался данным вопросом, т.к. программа сугубо под себя пишется…а в этом коде я просто разбирался с CodeDom, но можно организовать
параметр в функции компиляции или статичную переменную в CSScripting. Это позволит организовать поиск ошибок, когда нужно, из своей программы.
Имя темп-файлов, можно получить из assembly.FullName. Там будет общее имя этих файлов без расширения.

Еще, я намеренно допустил одно семантическое нарушение. Я обозвал интерфейс ICSScripting, хотя он не является интерфейсом к CSScripting, а является интерфейсом к генерируемым им FooXXX классам. Но мне показалось, что так будет выглядеть более красиво, что ли….

P.S. При написании использовалась информация от сюда: Dynamic-Code-Integration-with-CodeDom

One comment

  1. Сегодня столкнулся с таким эффектом. Если в тексте скрипта «using TestCodeDom;»
    будет раньше, чем System.Windows.Forms то при компиляции ругается, что в сборке System не найден Windows. Т.е. «using НашаПрограмма» надо писать последним…в чем причина не разобрался.

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *