从C#服务调用Perl脚本

时间:2013-11-24 23:52:57

标签: c# perl

我有一个需要调用perl脚本的c#服务。现在我的桌面上有perl脚本,只是引用了桌面的完整路径。是否可以将perl脚本添加到c#项目并将其构建到与构建后生成的.exe相同的目录中?这样,可以从当前路径引用该文件。代码如下。此外,perl脚本使用了我不想要的敏感信息,最好的方法是通过c#将敏感信息作为参数传递吗?

谢谢,

ProcessStartInfo perlStartInfo = new ProcessStartInfo(@" C:\ strawberry \ perl \ bin \ perl.exe");             perlStartInfo.RedirectStandardInput = true;             perlStartInfo.UseShellExecute = false;             perlStartInfo.CreateNoWindow = true;             进程perl = new Process();             perl.StartInfo = perlStartInfo;             perl.Start();

        byte[] byteArray = Encoding.ASCII.GetBytes(Properties.Resources.TransferChange);

        using (MemoryStream stream = new MemoryStream(byteArray))
        {

            stream.CopyTo(perl.StandardInput.BaseStream);

            // this will cause perl to execute the script
            perl.StandardInput.Close();
        }
        perl.Start();
        perl.WaitForExit();
        string output = perl.StandardOutput.ReadToEnd();

我添加了perl.Start();到代码。我一直到perl.WaitForExit();但它只是挂在那里。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果您希望永远不会将.pl文件保留到磁盘,则可以启动perl.exe并从资源流中通过STDIN管道脚本。将perl文件添加到项目中,将构建操作设置为“Resource”,然后使用以下内容启动该过程:

// set up processstartinfo 
perlStartInfo.RedirectStandardInput = true;
Process perl = new Process();
perl.StartInfo = perlStartInfo;
perl.Start();

using (var scriptStream = typeof(ThisClassType).Assembly.GetResourceStream(new Uri("thescript.pl")).Stream)
{
    scriptStream.CopyTo(perl.StandardInput.BaseStream);
    // this will cause perl to execute the script
    perl.StandardInput.Close();
}

perl.WaitForExit();
string output = perl.StandardOutput.ReadToEnd();