Встраивание интерпретатора Perl - PullRequest
2 голосов
/ 13 января 2010

только что скачал ActivePerl.Я хочу встроить интерпретатор perl в приложение C # (или хотя бы вызвать интерпретатор perl из C #).Мне нужно иметь возможность отправлять отправлять данные в Perl из C #, а затем получать вывод обратно в C #.

Я только что установил ActivePerl и добавил MS Script Control 1.0 в качестве ссылки.Я нашел этот код в Интернете, но у меня возникли проблемы с его работой.

 MSScriptControl.ScriptControlClass Interpreter = new MSScriptControl.ScriptControlClass();
Interpreter.Language = @"ActivePerl";
string Program = @"reverse 'abcde'";
string Results = (string)Interpreter.Eval(Program);
return Results;

Первоначально он имел «PerlScript» вместо «ActivePerl», но ни одна из них не работает для меня.Я не совсем уверен, что ожидает Interpreter.Language.Требуется ли путь к переводчику?

Решено ... Я не уверен, как, но когда я изменил его обратно на PerlScript, он теперь работает.Тем не менее, я хотел бы знать, использует ли MSScript Control ActivePerl или другой интерпретатор.

Ответы [ 2 ]

2 голосов
/ 12 мая 2010

Вы можете запустить внешнюю программу, как предлагает Максвелл, и в этом случае внешней программой может быть Perl или что-то еще. Возможно, будет проще использовать временные файлы для отправки входных данных и получения выходных данных, но это зависит от того, как внешняя программа ожидает получить свои данные.

Альтернатива, которую, я думаю, вы ищете, - это использовать компилятор PerlNET, который поставляется с Perl Dev Kit ActiveState. Это позволяет вам добавить обертку класса вокруг кода Perl, чтобы вы могли открыть ее для C #, как и любой класс C #. Это довольно просто в использовании; вы добавляете POD-комментарии к своему Perl-коду, чтобы указать имена методов и подписи для предоставления, включая информацию о типе, а затем компилируете свой Perl-модуль в сборку DLL .NET. После этого вы можете ссылаться на сборку из любой программы .NET, создавать объект из вашего класса Perl и вызывать его методы.

1 голос
/ 14 января 2010

Я не уверен насчет управления сценарием, но я сделал аналогичную вещь, где мне пришлось «встраивать» spamassasin (это Perl-программа). Я в основном использовал процесс, чтобы сделать работу. Что-то вроде:

var proc = new Process
    {
        StartInfo =
        {
            FileName = "perl",
            WorkingDirectory = HttpRuntime.AppDomainAppPath,
            Arguments = " myscript.pl arg1 arg2",
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            RedirectStandardInput = true,
            UseShellExecute = false
        }
    };
proc.Start();
proc.StandardInput.BaseStream.Write... // feed STDIN
proc.StandardOutput.Read... // Read program output
var procStdErr = proc.StandardError.ReadToEnd(); // errors
proc.StandardError.Close();
proc.StandardOutput.Close();
proc.WaitForExit(3000);
int exitCode = proc.ExitCode;
proc.Close();

Это, очевидно, не только специфично для Perl, и оно создает накладные расходы на создание процесса, поэтому, если вы слишком часто запускаете скрипт, возможно, вам нужно подумать о другом решении.

...