本文的发布号曾为 CHS305994
概要
本文逐步介绍如何在 Visual C# .Net 和带有 Visual Studio 的 Microsoft .NET 框架中为您要用作自动化对象的命令行实用工具编写包装。若要成功地为用作自动化对象的命令行实用工具生成包装,需要能够启动该进程,然后需要获得该进程的执行输出。此过程分成以下几个部分:
- 为包装编写代码:
- 新建存放包装代码的类。
- 向此类添加存放程序实际功能的内部方法。
- 在应用程序中使用包装:
- 将类文件添加到要使用此类的新应用程序。
为包装生成代码
若要为包装生成代码,首先要新建存放该代码的类。为此,请使用 Visual Studio 或文本编辑器(如"记事本")新建一个 Visual C# .Net 应用程序。备注:在本文中,Visual C# .Net 应用程序示例的名称是 LaunchEXE。
创建用于存放代码的新类之后,向此类添加将存放程序实际功能的内部方法。如果将此方法声明为内部的,则可以在整个程序中使用它;然而,程序外部的其他应用程序却无法访问它。
生成代码:
- 使用 USING 语句向编译器作出声明(请参考第一个代码片段)。USING 语句以如下方式使用 System.IO 和 System.Diagnostics 资源:
- System.IO:读取和写入到 StreamWriter 对象。
- System.Diagnostics:从应用程序启动外部进程。
- 声明 LaunchEXE 类,并声明 LaunchEXE 类的公共成员函数 Run。Run 方法将一个字符串返回给调用方。该字符串完成其工作之后,会保存 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) }
- 准备 StreamReader 对象以处理命令行工具的执行输出。StreamReader 对象执行下面的功能:
- 读取由可执行程序创建的输出。
- 创建一个包含可执行程序输出的字符串。此输出将被发送回调用应用程序。
- 将布尔值设置为 FALSE,声明此操作尚未成功。可以在操作成功完成之后将布尔值设置为 TRUE。
StreamReader outputStream = StreamReader.Null; string output = ""; bool success = false;
- 新建一个进程对象,然后传递可执行程序 (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();
- 如果该操作不超时,则从命令行实用工具的被取消的 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(); }
- 将输出返回到调用方法:
return "/t" + output;
- 将文件保存为 Start.cs。
返回页首
在应用程序中使用包装
若要使用包装,需要向将使用此类的新应用程序添加类文件。还可以在任何其他 Visual C# .Net 应用程序中使用此类。- 要将此类集成到 Visual Studio C# 应用程序中:
- 启动 Visual Studio。
- 打开新建项目对话框。在文件菜单上,指向新建,然后单击项目。
- 选择 Visual C# 项目,并选择 Windows 应用程序作为模板。
- 在名称框中键入项目的名称,然后单击确定。Visual Studio 就会新建一个 C# Windows 应用程序。
- 在"解决方案资源管理器"中,右键单击项目名称,指向添加,然后单击现有项。添加现有项对话框就会在 Visual Studio 中打开。若要向应用程序添加 C# 类文件,请浏览至存储 Start.cs 的文件夹,右键单击 Start.cs,然后单击打开。
- 若要从应用程序访问 Start.cs 中的类,请让您的类文件成为项目名称空间的成员:
- 在"解决方案资源管理器"中,右键单击为项目创建的 Form1.cs 文件,然后在主窗口中单击查看代码以打开 Form1.cs。在代码文件的顶端,应看到 word 名称空间,后面跟着项目名称。在 Start.cs 文件中的相同位置添加此行。
- 在"解决方案资源管理器"中,右键单击 Start.cs,然后单击查看代码。
- 在 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) { ...
- 使该类文件成为名称空间的成员以创建对类文件的引用,然后调用 Run 方法:
- 单击 Form1.cs [Design] 选项卡查看您的窗体。
- 在窗体上放一个按钮,然后在该按钮的 Click 事件内调用 Run 方法。
- 在视图菜单上,单击工具箱。
- 将按钮控件拖放到窗体上。双击该按钮以启动 Visual Studio 创建事件处理程序所用的代码编辑器,该事件处理程序用于放置按钮的 Click 事件的代码。它应该放在类似于下面示例的代码部分:
private void button1_Click(object sender, System.EventArgs e) { }
- 将下面的代码添加到事件处理程序以调用 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 秒内完成。此代码示例中的最后一行创建一个弹出消息,在该消息中显示命令行工具的输出。 - 按 F5 键以运行该应用程序。
- 单击窗体上的按钮。在 10 秒钟内,弹出消息框应打开并显示命令行工具的输出。
这篇文章中的信息适用于:
- Microsoft Visual C# .NET (2002)
最近更新: | 2002-7-19 (1.0) |
关键字 | kbDiagnostics kbhowto kbIO KB305994 |