我有一个需要调用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();但它只是挂在那里。有什么想法吗?
答案 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();