You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字符串数组转换回Process数组?附服务端与接收端代码

如何将进程字符串数组转回Process[]?

嘿,你现在的思路有个关键误区:Process.ToString()返回的只是进程的文本描述,不是可反序列化的结构化数据。比如你拿到的字符串可能是"System.Diagnostics.Process (notepad)",这种文本里没有重建Process实例需要的核心信息(比如进程ID、运行状态),所以直接拆分字符串根本没法转回Process[]。

下面给你两种可行的解决方案,从简单到更健壮:

方案一:传输进程关键标识(ID+名称),接收端重新获取进程

服务端修改代码

不要直接序列化Process.ToString(),而是提取进程的唯一标识(进程ID和名称)来拼接字符串:

var processlist = Process.GetProcesses();
// 用|分隔单个进程的ID和名称,用,分隔不同进程(选|是因为进程名不会包含这个字符)
string sendata = string.Join(",", processlist.Select(p => $"{p.Id}|{p.ProcessName}"));
writer.WriteLine(sendata);
writer.Flush();

接收端处理代码

拆分字符串后,根据进程ID去本地系统中获取对应的Process实例,同时验证进程名避免ID复用的问题:

string[] split = response.Split(',');
List<Process> processList = new List<Process>();

foreach (string processInfo in split)
{
    if (string.IsNullOrWhiteSpace(processInfo)) continue;
    
    string[] parts = processInfo.Split('|');
    if (parts.Length != 2) continue;
    
    if (int.TryParse(parts[0], out int processId))
    {
        try
        {
            Process process = Process.GetProcessById(processId);
            // 验证进程名,防止进程ID被系统复用
            if (process.ProcessName.Equals(parts[1], StringComparison.OrdinalIgnoreCase))
            {
                processList.Add(process);
            }
        }
        catch (ArgumentException)
        {
            // 进程已退出或不存在,跳过
            continue;
        }
        catch (InvalidOperationException)
        {
            // 无权限访问该进程,跳过
            continue;
        }
    }
}

Process[] result = processList.ToArray();

方案二:用JSON序列化结构化数据(更健壮)

如果需要传输更多进程信息,或者怕分隔符冲突,推荐用JSON序列化进程的DTO(数据传输对象):

服务端代码

先定义一个简单的DTO类,然后序列化:

// 定义进程传输类
public class ProcessDto
{
    public int Id { get; set; }
    public string ProcessName { get; set; }
    public string MainWindowTitle { get; set; }
}

// 序列化发送
var processlist = Process.GetProcesses();
var processDtos = processlist.Select(p => new ProcessDto
{
    Id = p.Id,
    ProcessName = p.ProcessName,
    MainWindowTitle = p.MainWindowTitle
});
string sendata = System.Text.Json.JsonSerializer.Serialize(processDtos);
writer.WriteLine(sendata);
writer.Flush();

接收端代码

反序列化后,再根据ID获取本地进程:

// 同样需要定义ProcessDto类
var processDtos = System.Text.Json.JsonSerializer.Deserialize<List<ProcessDto>>(response);
List<Process> processList = new List<Process>();

foreach (var dto in processDtos)
{
    try
    {
        Process process = Process.GetProcessById(dto.Id);
        if (process.ProcessName.Equals(dto.ProcessName, StringComparison.OrdinalIgnoreCase))
        {
            processList.Add(process);
        }
    }
    catch (Exception)
    {
        // 处理异常,跳过无效进程
        continue;
    }
}

Process[] result = processList.ToArray();

重要注意事项

  • 进程ID是可复用的:如果服务端发送后,某个进程退出了,系统可能把这个ID分配给新进程,所以验证进程名很有必要。
  • 跨机器限制:如果接收端和服务端不是同一台机器,Process.GetProcessById无法直接获取远程进程,这时需要用WMI或者远程管理API来实现。

内容的提问来源于stack exchange,提问作者Adrian Rudy Dacka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:57:38