目录
- 前言
- 一、生成exe
- 1.发布自包含版本
- 2.一些问题
- 使用 .NET Framework
- 修改项目文件
- 二、使用Process调用exe
- 子进程阻塞了父进程:
- 资源锁定:
- 无限循环:
- 命令行挂起:
- 1.解决方法
- 说明
前言
需要写一个小程序来监控桌面的情况,android所以想到用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+ 中使用其他方法来获取相同的信息。
使用 .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)其它相关文章!
精彩评论