刚刚下载了ActivePerl。我想将perl解释器嵌入到C#应用程序中(或者至少从C#调用perl解释器)。我需要能够从C#向Perl发送数据,然后将输出接收回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或其他解释器。
答案 0 :(得分:2)
您可以像Maxwell建议的那样运行外部程序,在这种情况下,外部程序可以是Perl或其他任何东西。使用临时文件发送输入数据并获取输出可能更容易,但这取决于外部程序期望获取其数据的方式。
我认为您正在寻找的替代方案是使用ActiveState的Perl Dev Kit附带的PerlNET编译器。它允许您在Perl代码周围添加类包装器,这样您就可以像任何C#类一样将它公开给C#。它使用起来相当简单;您将POD注释添加到Perl代码以指定要公开的方法名称和签名,包括类型信息,然后将Perl模块编译为DLL .NET程序集。完成后,您可以从任何.NET程序引用程序集,从Perl类构造一个对象,并调用其方法。
答案 1 :(得分:1)
我不确定脚本控件,但我做了类似的事情,我不得不'嵌入'spamassasin(这是一个Perl程序)。我基本上使用了Process来完成这项工作。有点像:
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特有的,并且它具有进程创建开销,因此如果您经常运行脚本,可能需要考虑不同的解决方案。