Запуск скриптов внутри C#
Я хочу запустить javascript/Python / Ruby внутри моего приложения.
У меня есть приложение, которое автоматически создает процесс на основе определения пользователя. Процесс генерируется на языке C#. Я хочу, чтобы продвинутые пользователи могли вводить скрипт в предопределенные местоположения. Эти сценарии должны выполняться из процесса C#. Например, созданный процесс будет иметь некоторые действия, и в середине сценарий должен быть запущен, а затем процесс продолжается по-прежнему. Есть ли механизм запустить эти скрипты из C#?
8 ответов
в принципе, у вас есть две проблемы: как определить точку инъекций в сгенерированном коде и как запустить скрипты python / ruby / whatev оттуда.
в зависимости от того, как вы генерируете процесс, одним из возможных решений было бы добавить функцию к каждой возможной точке инъекции. Функция проверяет, связал ли пользователь какие-либо скрипты с заданными точками, и если да, запускает скрипт, вызывая установить IronPython / IronRuby (С опционально заданные параметры).
недостатки включают: ограниченную доступность скриптов к созданному процессу (в основном, доступны только переменные, переданные в качестве параметров); а также ограничения реализации (текущая версия IronPython опускает несколько основных системных функций).
вы можете скомпилировать код C# из приложения C#, используя CSharpCodeProvider класса.
Если компиляция завершится успешно, вы можете запустить результирующую сборку как возвращенную через CompiledAssembly свойства CompilerResults класса.
.NET имеет язык сценариев, включая runtime engine в PowerShell, который может быть встроен в любое приложение .NET.
вы можете скомпилировать код C# "на лету" в сборку в памяти. Я думаю, что это возможно и с IronPython и IronRuby. Посмотри объект codedomprovider.CreateProvider метод.
Если вам нужно много запускать скрипты или если ваш процесс выполняется в течение длительного времени, вы можете загрузить эти сборки в другой AppDomain. И выгрузите AppDomain после того, как вы закончите со сценарием. В противном случае вы не сможете удалить их из памяти. Это имеет некоторые последствия для других классов в вашем проекте, потому что вы должны Маршалл все звонки.
вы думали о Visual Studio для приложений? Я мало слышал об этом с .NET 1.1, но, возможно, стоит взглянуть.
Я сделал именно это совсем недавно-разрешено добавление во время выполнения сценариев c#.
Это совсем не сложно, и эта статья:
http://www.divil.co.uk/net/articles/plugins/scripting.asp
является очень полезным резюме деталей.