2010-01-13 66 views
2

剛下載的ActivePerl。我想將perl解釋器嵌入到C#應用程序中(或者至少從C#中調用perl解釋器)。我需要能夠發送數據到C#的Perl,然後將輸出接收回C#。嵌入Perl解釋器

我剛剛安裝了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或其他解釋器。

回答

1

我不確定腳本控制,但我做了一個類似的事情,我不得不'嵌入'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具體的,它有進程創建開銷,因此,如果您運行的腳本,往往可能是你需要考慮不同的解決方案。

+2

關於「嵌入」的重要之處在於它不是嵌入。 :-P – hobbs 2010-01-15 00:27:08

+0

我看到:-)你也可以用這種方法做到這一點。涉及一點Perl魔力,但沒有太難。你可以傳遞你的腳本來perl stdin和eval那裏,或者使用一個臨時目錄,或者將你的acrip作爲嵌入資源嵌入到你的DLL等中。等等。Perl只是在任何託管環境中都不穩定,但是作爲它自己的進程。 Hopefuly Perl 6 ...我不確定腳本控制環境有人可能證明我錯了。 – ziya 2010-01-15 07:30:45

2

你可以像Maxwell建議的那樣運行一個外部程序,在這種情況下,外部程序可以是Perl或其他任何程序。使用臨時文件發送輸入數據並獲取輸出可能更容易,但這取決於外部程序如何獲取其數據。

我認爲您正在尋找的替代方案是使用隨ActiveState的Perl Dev Kit一起提供的PerlNET編譯器。它可以讓你在Perl代碼中添加一個類包裝,所以你可以像C#類一樣將它暴露給C#。使用相當簡單;您將POD註釋添加到Perl代碼中以指定要公開的方法名稱和簽名(包括類型信息),然後將Perl模塊編譯爲DLL .NET程序集。一旦完成,您可以從任何.NET程序中引用程序集,從Perl類構造一個對象,並調用它的方法。