Запуск скриптов внутри C#

Я хочу запустить javascript/Python / Ruby внутри моего приложения.

У меня есть приложение, которое автоматически создает процесс на основе определения пользователя. Процесс генерируется на языке C#. Я хочу, чтобы продвинутые пользователи могли вводить скрипт в предопределенные местоположения. Эти сценарии должны выполняться из процесса C#. Например, созданный процесс будет иметь некоторые действия, и в середине сценарий должен быть запущен, а затем процесс продолжается по-прежнему. Есть ли механизм запустить эти скрипты из C#?

8 ответов


в принципе, у вас есть две проблемы: как определить точку инъекций в сгенерированном коде и как запустить скрипты python / ruby / whatev оттуда.

в зависимости от того, как вы генерируете процесс, одним из возможных решений было бы добавить функцию к каждой возможной точке инъекции. Функция проверяет, связал ли пользователь какие-либо скрипты с заданными точками, и если да, запускает скрипт, вызывая установить IronPython / IronRuby (С опционально заданные параметры).

недостатки включают: ограниченную доступность скриптов к созданному процессу (в основном, доступны только переменные, переданные в качестве параметров); а также ограничения реализации (текущая версия IronPython опускает несколько основных системных функций).


посмотрите на IronPython и IronRuby-это позволит вам легко взаимодействовать с C#.


вы можете скомпилировать код C# из приложения C#, используя CSharpCodeProvider класса.

Если компиляция завершится успешно, вы можете запустить результирующую сборку как возвращенную через CompiledAssembly свойства CompilerResults класса.


удивительный язык сценариев C# -Script.Net


.NET имеет язык сценариев, включая runtime engine в PowerShell, который может быть встроен в любое приложение .NET.


вы можете скомпилировать код C# "на лету" в сборку в памяти. Я думаю, что это возможно и с IronPython и IronRuby. Посмотри объект codedomprovider.CreateProvider метод.

Если вам нужно много запускать скрипты или если ваш процесс выполняется в течение длительного времени, вы можете загрузить эти сборки в другой AppDomain. И выгрузите AppDomain после того, как вы закончите со сценарием. В противном случае вы не сможете удалить их из памяти. Это имеет некоторые последствия для других классов в вашем проекте, потому что вы должны Маршалл все звонки.


вы думали о Visual Studio для приложений? Я мало слышал об этом с .NET 1.1, но, возможно, стоит взглянуть.

http://msdn.microsoft.com/en-us/library/ms974548.aspx


Я сделал именно это совсем недавно-разрешено добавление во время выполнения сценариев c#.

Это совсем не сложно, и эта статья:

http://www.divil.co.uk/net/articles/plugins/scripting.asp

является очень полезным резюме деталей.