C#生成exe并用process运行

news2024/11/14 0:41:41

文章目录

  • 前言
  • 一、生成exe
    • 1.发布自包含版本
    • 2.一些问题
      • 1. 使用 .NET Framework
      • 修改项目文件
  • 二、使用Process调用exe
      • 子进程阻塞了父进程:
      • 资源锁定:
      • 无限循环:
      • 命令行挂起:
      • 1.解决方法
        • 示例代码
      • 说明
        • 1.启动 EXE 文件:
        • 2.启动 EXE 文件后,程序将继续执行 Main 方法中的后续代码。
        • 3.测试


前言

需要写一个小程序来监控桌面的情况,所以想到用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…”
执行其他任务
等待用户输入以保持控制台窗口打开

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2084910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源项目管理工具Taiga

什么是 Taiga &#xff1f; Taiga 是一个免费开源&#xff0c;而且功能非常强大的项目管理平台&#xff0c;用于初创企业和敏捷开发团队。Taiga 专注于简洁性&#xff0c;并且界面很干净简单。Taiga 也非常个性化&#xff0c;并集合了很多其它功能和外部工具&#xff0c;还有大…

如何恢复最近删除的文件?5种简单方法!

数据丢失在我们的工作生活中经常发生。当你决定清理硬盘或U盘时&#xff0c;你会删除一些文件夹或文件。如果你通过右键单击删除文件&#xff0c;则可以很容易从回收站恢复已删除的文件。但是&#xff0c;如果你按Shift Delete键、清空回收站或删除大于8998MB的大文件夹&#…

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(XGBoost分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#xff08;XGBoost分类器&#xff09; 文章目录 一、基本原理鲸鱼智能优化特征选择流程 二、实验结果三、核心代码四、代码获取五、总结 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序…

丹娜生物增利不增收:核心产品原材料面临不利因素,销售费用率攀升

《港湾商业观察》黄懿 7月15日&#xff0c;丹娜&#xff08;天津&#xff09;生物科技股份有限公司&#xff08;下称“丹娜生物”&#xff09;针对北交所出具的IPO问询文件进行了首轮回复&#xff0c;其保荐人为招商证券。7月26日&#xff0c;监管部门发出第二封问询函。 公开…

分布式场景下websocket解决方案

在项目中遇到&#xff1a;多个服务作为websocket服务端时&#xff0c;怎么跟前端设备进行数据通信的问题。具体解决方案&#xff0c;分享一下。 1.遇到问题 项目中使用websocket与前端设备建立长链接&#xff0c;用于推送过车、车位数、支付等相关信息&#xff0c;由于项目是负…

监控摄像头内存卡格式化了怎么恢复?

监控摄像头在现代社会中的应用越来越广泛&#xff0c;无论是家庭安防还是商业场所的安全监控&#xff0c;它们都扮演着重要的角色。然而&#xff0c;内存卡的数据丢失问题也时有发生&#xff0c;尤其是当内存卡被不小心格式化时&#xff0c;很多重要的监控数据可能会永久丢失。…

SpringBoot下获取resources目录下文件的常用方法

哈喽&#xff0c;大家好&#xff0c;今天给大家带来SpringBoot获取resources目录下文件的常用方法&#xff0c;示例中的方法是读取resources目录下的txt和xlsx文件&#xff0c;并将xlsx导出到excel的简单写法。完整代码放在最后。 通过this.getClass()方法获取 method1 - met…

linux安装mysql数据库,含公网链接(有网络带网安装)

1.检查是否存在mysql mysql出现这个&#xff0c;代表没安装 -bash: mysql: command not found 2.检查是否有mariadb数据库&#xff0c;如果有&#xff0c;需要先卸载。 rpm -qa | grep mariadb3.卸载现有的数据库 rpm -e --上个命令显示的名字4.在线安装&#xff0c;需要外…

【多线程】线程的等待通知机制-wait与notify

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;多线程 / javaEE初阶 我们都知道&#xff0c;线程在系统调度上是随机的&#xff0c;因此线程之间执⾏的先后顺序难以预知。但在实际开发中有时我们希望控制多个线程执行某个逻辑的先后顺序&#xff…

基于JSP高校应届生就业信息管理系统的设计与实现(全网第一无二,阿龙原创设计)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

C#骑砍逻辑类Mod制作详细解说

前言&#xff1a; 最近在研究骑砍的mod&#xff0c;主要是想修改其中的逻辑部分&#xff0c;因此有了这篇帖子。 一&#xff0c;文件夹与XML配置 在Modules创建一个新文件夹&#xff0c;文件夹名称随意&#xff0c;不影响实际的读取。 文件夹下面的位置需要固定&#xff0c;因…

大模型学习路线:从新手到专家的全面指南,从零基础到精通,非常详细收藏我这一篇就够了

随着人工智能技术的飞速发展&#xff0c;特别是近年来深度学习领域的突破&#xff0c;大规模预训练模型&#xff08;通常称为“大模型”&#xff09;已成为推动自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#xff08;CV&#xff09;等领域发展的关键力量。本文将为你…

CSS 嵌套元素的隐藏规则

简单介绍一下&#xff0c;在 HTML 和 CSS 中&#xff0c;元素大体分为 块级元素、内联元素&#xff08;行内元素&#xff09;、块级内联元素&#xff08;行内块元素&#xff09;。它们有着不同的嵌套规则和特殊之处。 1. 行内元素 行内元素特点&#xff1a;不独占一行、不可设…

06- Python的标识符

Python 标识符的知识点 简单地理解&#xff0c;标识符就是一个名字&#xff0c;就好像我们每个人都有属于自己的名字&#xff0c;它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。 Python 中标识符的命名不是随意的&#xff0c;而是要遵守一定的命令规则&#xf…

Qt 调用MFC dll,动态库中有界面

一、创建MFC 动态库工程 下一步 创建 点击确定 二、创建接口 这个是系统创建的&#xff0c;改成自己的接口。 头文件&#xff1a; #ifndef __WEB_ENGINE__ #define __WEB_ENGINE__#ifdef __cplusplus extern "C" { #endif__declspec(dllexport) bool __stdcall Loa…

Datawhale AI 夏令营-CV竞赛-Task2

# Datawhale AI 夏令营 夏令营手册&#xff1a;从零上手CV竞赛 比赛&#xff1a;2024“大运河杯”数据开发应用创新大赛——城市治理赛道 代码运行平台&#xff1a;厚德云 赛题任务 本赛题的任务是开发智能识别系统&#xff0c;用于自动检测和分类城市管理中的违规行为。通…

Vue组件的好处和理解、基本使用、注意事项、组件嵌套、VueComponent理解和原型链

目录 1. 组件的好处和理解2. Vue组件的使用2.1 Vue中使用组件的三大步骤2.2 注意事项 4. 组件的嵌套5. VueComponent的理解6. VueComponent原型链 1. 组件的好处和理解 传统方式编写应用&#xff0c;存在2大问题&#xff1a; 依赖关系混乱&#xff0c;不好维护代码复用率不高…

中资优配:人气牛股10连板!

三大股指今日弱势轰动&#xff0c;均创2月初以来新低&#xff1b;小盘股较为生动&#xff0c;万得微盘股指数涨超1%&#xff1b;两市成交额再度萎缩至5000亿元下方&#xff1b;港股走势疲弱&#xff0c;两大股指均跌超1%。 具体来看&#xff0c;沪指在银行、酿酒等板块的拖累下…

ESP32-IDF http请求崩溃问题解决

文章目录 esp32s3 http请求崩溃问题代码讨论修正后不崩溃的代码 ESP32S3板子, 一运行http请求百度网站的例子, 就会panic死机, 记录下过程. esp32s3 http请求崩溃 一执行http请求的perform就会崩溃, 打印如图 ESP32-IDF 的http请求代码是根据官方demo来改的, 第一步先连接wi…

佰朔资本:大盘股和小盘股的区别?大中小盘股划分标准?

一般来说&#xff0c;大盘股&#xff1a;流通市值在500亿及以上&#xff0c;中盘股&#xff1a;流通市值在100亿~500亿之间&#xff0c;小盘股&#xff1a;流通市值在100亿及以下。 留意&#xff1a;流通市值是可以上市买卖流通的股数与股价乘积&#xff0c;总市值由流通市值与…