Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌入Perl解释器_C#_Perl_Embed - Fatal编程技术网

C# 嵌入Perl解释器

C# 嵌入Perl解释器,c#,perl,embed,C#,Perl,Embed,刚刚下载了ActivePerl。我想将perl解释器嵌入到C#应用程序中(或者至少从C#调用perl解释器)。我需要能够从C#向Perl发送数据,然后将输出接收回C# 我刚刚安装了ActivePerl,并添加了MS Script Control 1.0作为参考。我在网上找到了这段代码,但在使用上遇到了麻烦 MSScriptControl.ScriptControlClass Interpreter = new MSScriptControl.ScriptControlClass(); Inte

刚刚下载了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”,但这两种方法都不适用于我。我不完全确定译员的期望是什么。它需要到解释器的路径吗


解决了。。。我不知道怎么做,但当我把它改回PerlScript时,它现在可以工作了。尽管如此,我还是想知道MSScript控件是否使用ActivePerl或其他解释器。

我不确定脚本控件,但我做了一件类似的事情,我必须“嵌入”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的,而且会产生进程创建开销,因此如果您经常运行脚本,可能需要考虑其他解决方案。

您可以按照Maxwell的建议运行外部程序,在这种情况下,外部程序可以是Perl或其他任何程序。使用临时文件发送输入数据和获取输出可能更容易,但这取决于外部程序希望如何获取其数据


我认为您正在寻找的另一种方法是使用ActiveState的Perl开发工具包附带的PerlNET编译器。它允许您在Perl代码周围添加一个类包装器,这样您就可以像任何C类一样将其公开给C。它使用起来相当简单;将POD注释添加到Perl代码中,以指定要公开的方法名称和签名,包括类型信息,然后将Perl模块编译成DLL.NET程序集。完成后,您可以从任何.NET程序引用程序集,从Perl类构造对象,并调用其方法。

关于“嵌入”的重要一点是,它不是嵌入的:-PI see:-)用这种方法你也可以做到。涉及一点Perl魔力,但不太难。您可以将脚本传递给perls stdin和eval,或者使用temp dir,或者将acrip作为“嵌入资源”嵌入到DLL中等等。只是Perl在任何托管环境中都不稳定,而是作为自己的进程。充满希望的Perl 6。。。我不确定脚本控制环境是否有人会证明我错了。