开发者

C#生成exe并用process运行的流程步骤

开发者 https://www.devze.com 2024-08-30 10:30 出处:网络 作者: FuWen_Hao
目录前言一、生成exe1.发布自包含版本2.一些问题使用 .NET Framework修改项目文件二、使用Process调用exe子进程阻塞了父进程:资源锁定:无限循环:命令行挂起:1.解决方法说明前言
目录
  • 前言
  • 一、生成exe
    • 1.发布自包含版本
    • 2.一些问题
      • 使用 .NET Framework
      • 修改项目文件
  • 二、使用Process调用exe
    • 子进程阻塞了父进程:
      • 资源锁定:
        • 无限循环:
          • 命令行挂起:
            • 1.解决方法
          • 说明

          前言

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

          一、生成exe

          1.发布自包含版本

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

          打开项目属性:右键点击项目 -> 属性。

          选择“发布”选项卡。

          选择“自包含”:在“发布模式”下拉菜单中选择“自包含”。

          选择目标运行时:选择 win-x64 或适合的目标平台。

          发布项目:点击编程“发布”。

          发布完成后,你可以在发布的目录中找到你的应用程序及其所有依赖项,然后将其复制到目标机器上运行即可。

          C#生成exe并用process运行的流程步骤

          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+ 中使用其他方法来获取相同的信息。

          使用 .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>
          
            &l编程客栈t;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,
                      RedirectStandardOutpjsut = 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…”

          执行其他任务

          等待用户输入以保持控制台窗口打开

          以上就是C#生成exe并用process运行的流程步骤的详细内容,更多关于C#生成exe并运行的资料请关注编程客栈(www.devze.com)其它相关文章!

          0

          精彩评论

          暂无评论...
          验证码 换一张
          取 消