HOW TO:使用 Visual C# .Net 为命令行工具编写包装 (From MSDN)

本文的发布号曾为 CHS305994
本文引用下面的 Microsoft .NET 框架类库名称空间:
  • System.IO
  • System.Diagnostics

本任务的内容

概要

本文逐步介绍如何在 Visual C# .Net 和带有 Visual Studio 的 Microsoft .NET 框架中为您要用作自动化对象的命令行实用工具编写包装。

若要成功地为用作自动化对象的命令行实用工具生成包装,需要能够启动该进程,然后需要获得该进程的执行输出。此过程分成以下几个部分:
  • 为包装编写代码:
    • 新建存放包装代码的类。
    • 向此类添加存放程序实际功能的内部方法。
  • 在应用程序中使用包装:
    • 将类文件添加到要使用此类的新应用程序。
返回页首

为包装生成代码

若要为包装生成代码,首先要新建存放该代码的类。为此,请使用 Visual Studio 或文本编辑器(如"记事本")新建一个 Visual C# .Net 应用程序。

备注:在本文中,Visual C# .Net 应用程序示例的名称是 LaunchEXE。

创建用于存放代码的新类之后,向此类添加将存放程序实际功能的内部方法。如果将此方法声明为内部的,则可以在整个程序中使用它;然而,程序外部的其他应用程序却无法访问它。

生成代码:
  1. 使用 USING 语句向编译器作出声明(请参考第一个代码片段)。USING 语句以如下方式使用 System.IO System.Diagnostics 资源:
    • System.IO:读取和写入到 StreamWriter 对象。
    • System.Diagnostics:从应用程序启动外部进程。
  2. 声明 LaunchEXE 类,并声明 LaunchEXE 类的公共成员函数 RunRun 方法将一个字符串返回给调用方。该字符串完成其工作之后,会保存 LaunchEXE 的输出。下面的列表介绍 Run 函数的三个参数:
    • 传递到 Run 函数的第一个参数是 exeName,这是您将启动的命令行工具应用程序的名称。除非指定一个完整路径作为另一个参数,否则此 .exe 文件必须与使用该类的应用程序驻留在同一文件夹中。在本文中,假定 .exe 文件与正在生成的应用程序位于同一文件夹中。
    • 传递到 Run 函数的第二个参数是 argsLine。此参数由一个字符串组成,该字符串包含将传递到命令行工具的参数。
    • 第三个参数定义 .exe 文件必须完成运行并返回结果所需要的时间(以秒计)。
    using System.Diagnostics;
    using System.IO;
    public class LaunchEXE
    {
    internal static string Run(string exeName, string argsLine, int timeoutSeconds)
    }
  3. 准备 StreamReader 对象以处理命令行工具的执行输出。StreamReader 对象执行下面的功能:
    • 读取由可执行程序创建的输出。
    • 创建一个包含可执行程序输出的字符串。此输出将被发送回调用应用程序。
  4. 将布尔值设置为 FALSE,声明此操作尚未成功。可以在操作成功完成之后将布尔值设置为 TRUE。
    StreamReader outputStream = StreamReader.Null;
    string output = "";
    bool success = false;
  5. 新建一个进程对象,然后传递可执行程序 (LauncheEXE),和参数 (argsLine) 以运行命令行实用工具。在此示例中,我们使用了 CreateNoWindow 属性,以便在每次调用您的类以启动可执行程序时取消 MS-DOS 窗口。
    try
    {
    	Process newProcess = new Process();
    	newProcess.StartInfo.FileName = exeName;
    	newProcess.StartInfo.Arguments = argsLine;
    newProcess.StartInfo.UseShellExecute = false;
    newProcess.StartInfo.CreateNoWindow = true;
    	newProcess.StartInfo.RedirectStandardOutput = true;
    	newProcess.Start();
  6. 如果该操作不超时,则从命令行实用工具的被取消的 MS-DOS 窗口获取输出,然后销毁对象:
    if (0 == timeoutSeconds)
    	{
    		outputStream = newProcess.StandardOutput;
    		output = outputStream.ReadToEnd();
    		newProcess.WaitForExit();
    	}
    	else
    	{
    		success = newProcess.WaitForExit(timeoutSeconds * 1000);
    	
    if (success)
    	{
    outputStream = newProcess.StandardOutput;
    		output = outputStream.ReadToEnd();
    	}
    else
    	{
    		output = "Timed out at " + timeoutSeconds + " seconds waiting for " + exeName + " to exit.";
    	}
    }
    
    catch (Exception e)
    {
    throw (new Exception("An error occurred running " + exeName + ".",e));
    }
    finally
    {
    outputStream.Close();
    }
  7. 将输出返回到调用方法:
    return "/t" + output;
  8. 将文件保存为 Start.cs。
此代码示例提供了一种包装所有命令行实用工具的有效方式。在您编写的应用程序中,可调用 LaunchEXE 类的 Run 方法并将它与相应参数及超时值一起传递给任何可执行程序,然后在您自己的应用程序中分析结果。

返回页首

在应用程序中使用包装

若要使用包装,需要向将使用此类的新应用程序添加类文件。还可以在任何其他 Visual C# .Net 应用程序中使用此类。
  1. 要将此类集成到 Visual Studio C# 应用程序中:
    1. 启动 Visual Studio。
    2. 打开新建项目对话框。在文件菜单上,指向新建,然后单击项目
    3. 选择 Visual C# 项目,并选择 Windows 应用程序作为模板。
    4. 名称框中键入项目的名称,然后单击确定。Visual Studio 就会新建一个 C# Windows 应用程序。
    5. 在"解决方案资源管理器"中,右键单击项目名称,指向添加,然后单击现有项添加现有项对话框就会在 Visual Studio 中打开。若要向应用程序添加 C# 类文件,请浏览至存储 Start.cs 的文件夹,右键单击 Start.cs,然后单击打开
  2. 若要从应用程序访问 Start.cs 中的类,请让您的类文件成为项目名称空间的成员:
    1. 在"解决方案资源管理器"中,右键单击为项目创建的 Form1.cs 文件,然后在主窗口中单击查看代码以打开 Form1.cs。在代码文件的顶端,应看到 word 名称空间,后面跟着项目名称。在 Start.cs 文件中的相同位置添加此行。
    2. 在"解决方案资源管理器"中,右键单击 Start.cs,然后单击查看代码
    3. USING 语句后面添加名称空间行。

      现在您的代码应类似于下面的示例(在本示例中,项目名称是 WindowsApplication1):
    using System;
    using System.IO;
    using System.Diagnostics;
    
    namespace WindowsApplication1
    {
    	internal class LaunchEXE
    	{
    		internal static string Run(string exeName, string argsLine, int timeoutSeconds)
    		{
            ...
  3. 使该类文件成为名称空间的成员以创建对类文件的引用,然后调用 Run 方法:
    1. 单击 Form1.cs [Design] 选项卡查看您的窗体。
    2. 在窗体上放一个按钮,然后在该按钮的 Click 事件内调用 Run 方法。
      1. 视图菜单上,单击工具箱
      2. 将按钮控件拖放到窗体上。双击该按钮以启动 Visual Studio 创建事件处理程序所用的代码编辑器,该事件处理程序用于放置按钮的 Click 事件的代码。它应该放在类似于下面示例的代码部分:
      private void button1_Click(object sender, System.EventArgs e)
      {
      		
      }
  4. 将下面的代码添加到事件处理程序以调用 Run 函数:
    private void button1_Click(object sender, System.EventArgs e)
    {
    string output;
    output = LaunchEXE.Run("CommandLineTool.exe", "arg1 arg2", 10);
    System.Windows.Forms.MessageBox.Show(output);
    }
    在此代码的第一行,您声明了一个名为 output 的新变量,用于存储命令行工具的结果。在第二行,您声明了 output 变量等于 Run 方法返回的结果。在此行中,您还指定了要启动 CommandLineTool.exe(可以将该程序替换为您自己的命令行工具的名称)。给命令行工具传递两个参数 arg1 arg2(可以将这些参数替换为您要传递给 .exe 程序的参数名称)。第三个参数的值为 10,它指示命令行工具必须在 10 秒内完成。此代码示例中的最后一行创建一个弹出消息,在该消息中显示命令行工具的输出。
  5. 按 F5 键以运行该应用程序。
  6. 单击窗体上的按钮。在 10 秒钟内,弹出消息框应打开并显示命令行工具的输出。
在实际应用程序中,您可以分析从命令行工具返回的输出,并通过图形用户界面 (GUI) 以更友好的形式向用户显示。

这篇文章中的信息适用于:

  • Microsoft Visual C# .NET (2002)
最近更新:2002-7-19 (1.0)
关键字kbDiagnostics kbhowto kbIO KB305994
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值