前言
需要写一个小程序来监控桌面的情况,所以想到用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> <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…”
执行其他任务
等待用户输入以保持控制台窗口打开
以上就是c#生成exe并用process运行的流程步骤的详细内容,更多关于c#生成exe并运行的资料请关注代码网其它相关文章!
发表评论