.NET 创建、读取和写入进程类

创建进程的示例以及如何使用 System.Diagnostics.Process 类读取控制台输出并写入控制台以及如何使用 Windows 管理规范 (WMI) 在远程计算机上创建进程;用 C# 和 VB.NET 编写。

在.NET中创建一个新进程,Process.Start("notepad.exe")通过创建对象可以实现简单但更多的控制Process。Process.Start("http://www.bing.com")也可以。可能,Process.Start()正在使用WinAPI ShellExecute()函数,而Process对象正在使用该CreateProcess()函数(至少对于 Windows 平台而言)。

了解如何使用 HttpClient从 URL 下载文件或终止进程。

VB.NET:

Imports System.Diagnostics

Module Module1

Sub Main()

Dim pro As New Process()

pro.StartInfo.FileName = "notepad.exe"

pro.StartInfo.Arguments = "temp.txt"

' NOTE: can specify ProcessWindowStyle.Hidden for programs that do not need user input

pro.StartInfo.WindowStyle = ProcessWindowStyle.Normal

pro.Start()

pro.WaitForExit()

End Sub

End Module

C#:

using System.Diagnostics;

namespace Console1

{

class Program

{

static void Main(string\[\] args)

{

Process pro = new Process();

pro.StartInfo.FileName = "notepad.exe";

pro.StartInfo.Arguments = "temp.txt";

// NOTE: can specify ProcessWindowStyle.Hidden for programs that do not need user input

pro.StartInfo.WindowStyle = ProcessWindowStyle.Normal;

pro.Start();

pro.WaitForExit();

}

}

}

读取控制台应用程序输出

创建一个控制台进程并读取其输出。

using (var proc = new System.Diagnostics.Process

{

StartInfo = new System.Diagnostics.ProcessStartInfo

{

FileName = "/bin/executable",

Arguments = "-arguments",

UseShellExecute = false,

RedirectStandardOutput = true,

CreateNoWindow = true

}

})

{

proc.Start();

while (!proc.StandardOutput.EndOfStream)

{

// NOTE: can also read one character at a time with proc.StandardOutput.Read() for more of a "real-time" effect

string line = proc.StandardOutput.ReadLine();

// NOTE: do something with this line of text

}

}

现在,从控制台进程读取二进制数据。

using (var proc = new System.Diagnostics.Process

{

StartInfo = new System.Diagnostics.ProcessStartInfo

{

FileName = "/bin/executable",

Arguments = "-arguments",

UseShellExecute = false,

RedirectStandardOutput = true,

CreateNoWindow = true

}

})

{

proc.Start();

using (BinaryReader reader = new BinaryReader(proc.StandardOutput.BaseStream))

{

byte\[\] chunk = reader.ReadBytes(1024);

while (chunk.Length > 0)

{

// NOTE: do something with this byte array

chunk = reader.ReadBytes(1024);

}

}

}

写入控制台应用程序

实际上,如果对控制台应用程序进行读取和写入,则可能在不同的线程上进行,同样,控制台应用程序也可能在不同的线程上进行读取和写入。这是因为Console.ReadLine()、proc.StandardOutput.Read()和proc.StandardOutput.ReadLine()是阻塞的。

using (var proc = new System.Diagnostics.Process

{

StartInfo = new System.Diagnostics.ProcessStartInfo

{

FileName = Path.Combine(Environment.CurrentDirectory, "executable.exe"),

Arguments = "/command /line /arguments /go /here",

UseShellExecute = false,

RedirectStandardOutput = true, // NOTE: optional

RedirectStandardInput = true, // NOTE: required

CreateNoWindow = true, // NOTE: optional

WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden // NOTE: optional

}

})

{

proc.StandardInput.WriteLine("Hello, World!"); // NOTE: this will send "Hello, World!" to the console application's process

proc.StandardOutput.ReadLine();

}

在远程机器上创建进程

可以从 C# 应用程序远程在另一台计算机上创建进程,但这需要满足有关网络配置、权限和安全设置的特定条件。实现此目的的方法通常涉及使用 Windows 管理规范 (WMI)、PowerShell 远程处理或支持远程命令执行的其他网络协议。

Windows 管理规范 (WMI) 是一项 Windows 功能,它提供了一种与系统管理数据和操作进行交互的标准化方法。使用 WMI 在远程计算机上创建进程,但要确保本地计算机和远程计算机都配置为允许 WMI 访问。

using System;

using System.Management;

class Program

{

static void Main()

{

string remoteComputer = "REMOTE_COMPUTER_NAME";

string domain = "DOMAIN_NAME"; // NOTE: can be an empty string if not on a domain

string username = "USERNAME";

string password = "PASSWORD";

string processToRun = @"C:\Path\To\Executable.exe /command-line-argument";

ConnectionOptions connOptions = new ConnectionOptions();

connOptions.Username = domain + "\\" + username;

connOptions.Password = password;

connOptions.Impersonation = ImpersonationLevel.Impersonate;

connOptions.EnablePrivileges = true;

ManagementScope manScope = new ManagementScope($@"\\{remoteComputer}\root\cimv2", connOptions);

try

{

manScope.Connect();

ObjectGetOptions objectGetOptions = new ObjectGetOptions();

ManagementPath managementPath = new ManagementPath("Win32_Process");

ManagementClass processClass = new ManagementClass(manScope, managementPath, objectGetOptions);

ManagementBaseObject inParams = processClass.GetMethodParameters("Create");

inParams"CommandLine" = processToRun;

ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null);

Console.WriteLine("Return Value: " + outParams"ReturnValue"); // NOTE: return value of 0 means success, just like with any regular process

}

catch (Exception e)

{

Console.WriteLine("Error: " + e.Message);

}

}

}

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
淡海水3 小时前
01-04-认知篇-Unity内存全景
unity·c#·游戏引擎·.net·gc
JosieBook5 小时前
【.NET工程师】.NET 工程师成长体系(精要版)
.net
淡海水14 小时前
01-03-认知篇-C#内存模型深度解析
unity·c#·游戏引擎·.net·gc
AKULAKK2 天前
关于在Ghost版Win7上运行.net 2程序遇到的问题以及解决办法
.net·win7
波力海苔夹心脆6752 天前
C# 序列化与反序列化详解:System.Text.Json、Newtonsoft.Json、XmlSerializer 用法、特性选项与安全实践
经验分享·后端·c#·json·.net
mudtools2 天前
在.NET现有系统中快速集成飞书任务分配能力
后端·c#·.net
小羊没烦恼!2 天前
【译】利用Asp.net MVC处理文件的上传下载
开发语言·缓存·c#·word·powerpoint·.net
唐青枫3 天前
我用 C# 开发了一款电子发票自动整理工具
c#·.net
我是唐青枫3 天前
我用 C# 开发了一款电子发票自动整理工具
c#·.net
唐青枫3 天前
别把 WPF 写成一个 MainWindow:C#.NET Prism 模块化开发详解
c#·.net