如何在C#应用程序中调用Perl脚本?
发布时间:2020-12-15 08:29:00 所属栏目:百科 来源:网络整理
导读:我想捕获Perl程序的输出并在C# Windows窗体的文本框中显示输出数据(屏幕上的字符串). 这是我的主要C#代码: public partial class frmMain : Form{ private Process myProcess = null; public frmMain() { InitializeComponent(); } public delegate void Up
我想捕获Perl程序的输出并在C#
Windows窗体的文本框中显示输出数据(屏幕上的字符串).
这是我的主要C#代码: public partial class frmMain : Form { private Process myProcess = null; public frmMain() { InitializeComponent(); } public delegate void UpdateUIDelegate(string data); private void btnRun_Click(object sender,EventArgs e) { myProcess = new Process(); ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("perl.exe"); myProcessStartInfo.Arguments = "test.pl"; myProcessStartInfo.UseShellExecute = false; myProcessStartInfo.RedirectStandardOutput = true; myProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden; myProcessStartInfo.CreateNoWindow = true; myProcess.StartInfo = myProcessStartInfo; myProcess.OutputDataReceived += new DataReceivedEventHandler(myProcess_OutputDataReceived); myProcess.Start(); myProcess.BeginOutputReadLine(); } void myProcess_OutputDataReceived(object sender,DataReceivedEventArgs e) { if (txtOutput.InvokeRequired) { UpdateUIDelegate updateDelegate = new UpdateUIDelegate(UpdateUI); this.Invoke(updateDelegate,e.Data); } } void UpdateUI(string data) { txtOutput.Text += data + "rn"; } } 和test.pl的代码: my @a = qw{1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19}; my @b = qw{a b c d e f g h i j k l m n o p q r s }; print 'start' . "n"; while ( my ( $item1,$item2) = ( splice (@a,1),splice (@b,1) ) ) { print 'Item 1: ' . $item1 . "n"; print 'Item 2: ' . $item2 . "n"; warn 'Finish one item' . "n"; sleep(1); } 我有一个问题是输出数据只显示在文本框上,直到Perl完成. 当我发现它时,更有趣的是,如果我对控制台应用程序(C#)做同样的事情,一切似乎都没问题. 这是控制台应用程序的代码: class Program { static void Main(string[] args) { Process myProcess = new Process(); ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("perl.exe"); myProcessStartInfo.Arguments = "test.pl"; myProcessStartInfo.UseShellExecute = false; myProcessStartInfo.RedirectStandardOutput = true; myProcess.StartInfo = myProcessStartInfo; myProcess.OutputDataReceived += new DataReceivedEventHandler(myProcess_OutputDataReceived); myProcess.Start(); myProcess.BeginOutputReadLine(); Console.Read(); } static void myProcess_OutputDataReceived(object sender,DataReceivedEventArgs e) { Console.WriteLine(e.Data); } } 我想弄清楚我的表单应用程序会发生什么,但仍然找不到任何线索. 解决方法
您将需要使用多个线程,因此它不会中断您的UI.我有一个相当大的实用程序类,它在自己的线程和管道上启动进程到委托事件.
对不起,我举了一个例子,但实际上我很急.但是,使用Perl脚本需要注意的另一件事是它们不能很好地自动刷新输出.你需要把: local $| = 1; 在脚本的顶部,您正在运行,因此它会自动刷新. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |