前言

需要写一个小程序来监控桌面的情况,所以想到用cmd来运行exe监控

一、生成exe

1.发布自包含版本

假设你已经在 Visual Studio 中打开了项目,以下是发布自包含版本的步骤:

打开项目属性:右键点击项目 -> 属性。
选择“发布”选项卡。
选择“自包含”:在“发布模式”下拉菜单中选择“自包含”。
选择目标运行时:选择 win-x64 或适合的目标平台。
发布项目:点击“发布”。
发布完成后,你可以在发布的目录中找到你的应用程序及其所有依赖项,然后将其复制到目标机器上运行即可。
在这里插入图片描述

2.一些问题

我运行遇到报错:

System.PlatformNotSupportedException: System.Management currently is only supported for Windows desktop applications.
   at System.Management.ManagementObjectSearcher..ctor(String queryString)
   at FlaUI.Core.WindowsAPI.WindowsApiTools.GetMainModuleFilepath(Process process)
   at FlaUI.Core.Application.Attach(Process process)

遇到的 System.PlatformNotSupportedException 错误是因为 System.Management 命名空间中的类仅支持在传统的 Windows 桌面应用程序(如基于 .NET Framework 的应用程序)中使用,而不是在 .NET Core 或 .NET 5+ 中使用。

FlaUI 库使用 System.Management 来获取某些系统信息,例如进程的主模块文件路径。在 .NET Core 或 .NET 5+ 中,System.Management 不可用。

解决这个问题的方法有两种:

使用 .NET Framework:你可以将项目迁移到 .NET Framework。
使用替代方法:你可以在 .NET Core 或 .NET 5+ 中使用其他方法来获取相同的信息。

1. 使用 .NET Framework

如果你可以接受使用 .NET Framework,你可以将项目转换为 .NET Framework 项目。这通常涉及更改项目文件中的 TargetFramework 元素。

修改项目文件

打开你的 .csproj 文件,将 TargetFramework 更改为 .NET Framework 4.7.2 或更高版本:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net472</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="FlaUI.Core" Version="3.5.0" />
    <PackageReference Include="FlaUI.UIA3" Version="3.5.0" />
  </ItemGroup>

</Project>

二、使用Process调用exe

如果你在一个程序中使用 cmd 运行了一个 EXE 文件,而该 EXE 文件的执行导致了你的程序无法继续执行,这可能是因为以下几个原因:

子进程阻塞了父进程:

如果子进程(即你运行的 EXE 文件)没有正确关闭,可能会导致父进程(即你的程序)被阻塞。

资源锁定:

EXE 文件可能占用了某些资源(如文件句柄、内存等),导致父进程无法继续执行。

无限循环:

EXE 文件中可能存在无限循环或长时间运行的任务,导致它不会自动退出。

命令行挂起:

如果 EXE 文件在命令行中运行并且没有退出,可能会导致命令行窗口一直保持打开状态,从而影响到父进程的继续执行。

1.解决方法

如果你希望在启动一个外部 EXE 文件后让主程序继续执行,而不等待 EXE 文件结束,可以使用 Process.Start 方法的非阻塞模式。这意味着启动 EXE 文件后,你的程序将继续执行后续代码。

以下是如何做到这一点的示例代码:

示例代码
使用 Process.Start 启动 EXE 文件:
使用 Process.Start 方法启动 EXE 文件,并设置 UseShellExecute 为 false。
设置 CreateNoWindow 为 true,以避免创建新的命令行窗口。
确保 EXE 文件在后台运行:
使用 StartInfo.Arguments 来传递参数,确保 EXE 文件在后台运行。

示例代码
using System;
using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Starting EXE file...");

        // 构造 ProcessStartInfo 对象
        ProcessStartInfo startInfo = new ProcessStartInfo
        {
            FileName = "path_to_your_exe.exe", // 替换为你的 EXE 文件路径
            UseShellExecute = false,
            RedirectStandardOutput = true,
            CreateNoWindow = true
        };

        // 启动 EXE 文件
        Process.Start(startInfo);

        Console.WriteLine("EXE file started in background.");

        // 主程序继续执行后续代码
        Console.WriteLine("Parent program continues...");

        // 示例:执行其他操作
        DoSomethingElse();

        // 等待用户输入以保持控制台窗口打开
        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
    }

    static void DoSomethingElse()
    {
        Console.WriteLine("Performing other tasks...");
        // 这里可以执行其他任务
    }
}

说明

1.启动 EXE 文件:

使用 Process.Start(startInfo) 启动 EXE 文件。这不会阻塞当前程序的执行。
避免创建新窗口:
设置 CreateNoWindow = true 可以避免创建新的命令行窗口。
继续执行后续代码:

2.启动 EXE 文件后,程序将继续执行 Main 方法中的后续代码。
3.测试

运行上述程序,你会看到:

输出 “Starting EXE file…”
EXE 文件将在后台启动
输出 “EXE file started in background.”
输出 “Parent program continues…”
执行其他任务
等待用户输入以保持控制台窗口打开

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部