c# 调用 CRFs应用程序

今天想用C#调用crfs,但是老出问题。原因有几点。第一,我对crf不理解,虽然我用cmd跑了一遍,但是根本不理解为什么,而且只是草草看了下参数该输入什么,只是了解了形式,没有了解实质。所以在调用的时候,我不知道怎样转移输入输出的参数。另外,crf_learn在cmd运行的时候,用到了一个自带的dll文件我也不知道怎么处理。而且我在网上找类似调用的例子也找不到。第二,对找到的实例代码不熟悉,没有理解每一行代码的含义和作用。第三,不知道怎么输出结果,不会适当的断点。

经过一位同学的帮助,他帮我解决了以问题。最终运行成功。

Console.WriteLine("aaaaa"); //用于测试输出
System.Diagnostics.Process p = new System.Diagnostics.Process();  //开始系统进程
p.StartInfo = new System.Diagnostics.ProcessStartInfo(@"C:UsersAMYDesktop estcrf_learn.exe");  //应用程序路径
p.StartInfo.Arguments = @" C:UsersAMYDesktop est emplate C:UsersAMYDesktop est rain.data C:UsersAMYDesktop estmodel"; //参数输入
p.StartInfo.RedirectStandardOutput = true; //结果输出
p.StartInfo.UseShellExecute = false; //是否在shell中显示
p.Start();
//p.WaitForExit();
Console.WriteLine("nnnn");

p.Close() //要记得释放资源,不然程序会很慢很慢的。
Console.ReadKey();

dll文件在CRFs运行的时候是可以自己找到的,只要你把它和learn.exe文件放在一个文件夹里面。另外test的结果不能通过参数来重定向,所以,只能将输出流保存到字符串,再保存到txt文件。现阶段(2015.11.8)完整的代码为:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;

private void start_CRFs_Click_1(object sender, EventArgs e)
{
Stopwatch sw = new Stopwatch();
sw.Start();

string TrainDirectory = Train_directoryT.Text;
string ArgumentsStr = tb_Arguments.Text;
string output = "";
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo = new System.Diagnostics.ProcessStartInfo(TrainDirectory + "crf_learn.exe");
p.StartInfo.Arguments = ArgumentsStr + " " + TrainDirectory + "template " + TrainDirectory + "train.data " + TrainDirectory + "model";
string argStr = p.StartInfo.Arguments;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.Start();
tbtrain_result.Text = p.StandardOutput.ReadToEnd();
p.WaitForExit();
p.Close();

// System.Threading.Thread.Sleep(50000); 最好能用多线程来处理
System.Diagnostics.Process p2 = new System.Diagnostics.Process();
p2.StartInfo = new System.Diagnostics.ProcessStartInfo(TrainDirectory + "crf_test.exe");//需要启动的程序名
p2.StartInfo.Arguments = " -m " + TrainDirectory + "model " + TrainDirectory + "test.data";
p2.StartInfo.RedirectStandardOutput = true;
p2.StartInfo.UseShellExecute = false;
p2.Start();
output = p2.StandardOutput.ReadToEnd();
TbTest_outputT.Text = output;
byte[] buffer = Encoding.Default.GetBytes(output);
File.WriteAllBytes(TrainDirectory + "output.txt", buffer);
p2.Close();
sw.Stop();
TimeSpan ts = sw.Elapsed;
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
TimeSpanL.Text = "用时:" + elapsedTime;
}

一些输入输出定义的变量用的时候记得先定义好。

其实很多不会的知识点,或是一些知识点的细节都是百度到的,记得好的笔记真心让人受益匪浅。最后程序也算是成功的跑起来了,所以,我把学会的东西记下来,一来是可以日后自己复习,二来也可以跟大家一起分享

原文地址:https://www.cnblogs.com/MiWang/p/4943555.html