C#生成exe并用process運(yùn)行的流程步驟
前言
需要寫(xiě)一個(gè)小程序來(lái)監(jiān)控桌面的情況,所以想到用cmd來(lái)運(yùn)行exe監(jiān)控
一、生成exe
1.發(fā)布自包含版本
假設(shè)你已經(jīng)在 Visual Studio 中打開(kāi)了項(xiàng)目,以下是發(fā)布自包含版本的步驟:
打開(kāi)項(xiàng)目屬性:右鍵點(diǎn)擊項(xiàng)目 -> 屬性。
選擇“發(fā)布”選項(xiàng)卡。
選擇“自包含”:在“發(fā)布模式”下拉菜單中選擇“自包含”。
選擇目標(biāo)運(yùn)行時(shí):選擇 win-x64 或適合的目標(biāo)平臺(tái)。
發(fā)布項(xiàng)目:點(diǎn)擊“發(fā)布”。
發(fā)布完成后,你可以在發(fā)布的目錄中找到你的應(yīng)用程序及其所有依賴項(xiàng),然后將其復(fù)制到目標(biāo)機(jī)器上運(yùn)行即可。
2.一些問(wèn)題
我運(yùn)行遇到報(bào)錯(cuò):
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 錯(cuò)誤是因?yàn)?System.Management 命名空間中的類僅支持在傳統(tǒng)的 Windows 桌面應(yīng)用程序(如基于 .NET Framework 的應(yīng)用程序)中使用,而不是在 .NET Core 或 .NET 5+ 中使用。
FlaUI 庫(kù)使用 System.Management 來(lái)獲取某些系統(tǒng)信息,例如進(jìn)程的主模塊文件路徑。在 .NET Core 或 .NET 5+ 中,System.Management 不可用。
解決這個(gè)問(wèn)題的方法有兩種:
使用 .NET Framework:你可以將項(xiàng)目遷移到 .NET Framework。
使用替代方法:你可以在 .NET Core 或 .NET 5+ 中使用其他方法來(lái)獲取相同的信息。
使用 .NET Framework
如果你可以接受使用 .NET Framework,你可以將項(xiàng)目轉(zhuǎn)換為 .NET Framework 項(xiàng)目。這通常涉及更改項(xiàng)目文件中的 TargetFramework 元素。
修改項(xiàng)目文件
打開(kāi)你的 .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調(diào)用exe
如果你在一個(gè)程序中使用 cmd 運(yùn)行了一個(gè) EXE 文件,而該 EXE 文件的執(zhí)行導(dǎo)致了你的程序無(wú)法繼續(xù)執(zhí)行,這可能是因?yàn)橐韵聨讉€(gè)原因:
子進(jìn)程阻塞了父進(jìn)程:
如果子進(jìn)程(即你運(yùn)行的 EXE 文件)沒(méi)有正確關(guān)閉,可能會(huì)導(dǎo)致父進(jìn)程(即你的程序)被阻塞。
資源鎖定:
EXE 文件可能占用了某些資源(如文件句柄、內(nèi)存等),導(dǎo)致父進(jìn)程無(wú)法繼續(xù)執(zhí)行。
無(wú)限循環(huán):
EXE 文件中可能存在無(wú)限循環(huán)或長(zhǎng)時(shí)間運(yùn)行的任務(wù),導(dǎo)致它不會(huì)自動(dòng)退出。
命令行掛起:
如果 EXE 文件在命令行中運(yùn)行并且沒(méi)有退出,可能會(huì)導(dǎo)致命令行窗口一直保持打開(kāi)狀態(tài),從而影響到父進(jìn)程的繼續(xù)執(zhí)行。
1.解決方法
如果你希望在啟動(dòng)一個(gè)外部 EXE 文件后讓主程序繼續(xù)執(zhí)行,而不等待 EXE 文件結(jié)束,可以使用 Process.Start 方法的非阻塞模式。這意味著啟動(dòng) EXE 文件后,你的程序?qū)⒗^續(xù)執(zhí)行后續(xù)代碼。
以下是如何做到這一點(diǎn)的示例代碼:
示例代碼
使用 Process.Start 啟動(dòng) EXE 文件:
使用 Process.Start 方法啟動(dòng) EXE 文件,并設(shè)置 UseShellExecute 為 false。
設(shè)置 CreateNoWindow 為 true,以避免創(chuàng)建新的命令行窗口。
確保 EXE 文件在后臺(tái)運(yùn)行:
使用 StartInfo.Arguments 來(lái)傳遞參數(shù),確保 EXE 文件在后臺(tái)運(yùn)行。
示例代碼
using System; using System.Diagnostics; class Program { static void Main(string[] args) { Console.WriteLine("Starting EXE file..."); // 構(gòu)造 ProcessStartInfo 對(duì)象 ProcessStartInfo startInfo = new ProcessStartInfo { FileName = "path_to_your_exe.exe", // 替換為你的 EXE 文件路徑 UseShellExecute = false, RedirectStandardOutput = true, CreateNoWindow = true }; // 啟動(dòng) EXE 文件 Process.Start(startInfo); Console.WriteLine("EXE file started in background."); // 主程序繼續(xù)執(zhí)行后續(xù)代碼 Console.WriteLine("Parent program continues..."); // 示例:執(zhí)行其他操作 DoSomethingElse(); // 等待用戶輸入以保持控制臺(tái)窗口打開(kāi) Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } static void DoSomethingElse() { Console.WriteLine("Performing other tasks..."); // 這里可以執(zhí)行其他任務(wù) } }
說(shuō)明
1.啟動(dòng) EXE 文件:
使用 Process.Start(startInfo) 啟動(dòng) EXE 文件。這不會(huì)阻塞當(dāng)前程序的執(zhí)行。
避免創(chuàng)建新窗口:
設(shè)置 CreateNoWindow = true 可以避免創(chuàng)建新的命令行窗口。
繼續(xù)執(zhí)行后續(xù)代碼:
2.啟動(dòng) EXE 文件后,程序?qū)⒗^續(xù)執(zhí)行 Main 方法中的后續(xù)代碼。
3.測(cè)試
運(yùn)行上述程序,你會(huì)看到:
輸出 “Starting EXE file…”
EXE 文件將在后臺(tái)啟動(dòng)
輸出 “EXE file started in background.”
輸出 “Parent program continues…”
執(zhí)行其他任務(wù)
等待用戶輸入以保持控制臺(tái)窗口打開(kāi)
以上就是C#生成exe并用process運(yùn)行的流程步驟的詳細(xì)內(nèi)容,更多關(guān)于C#生成exe并運(yùn)行的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
VS中C#讀取app.config數(shù)據(jù)庫(kù)配置字符串的三種方法
這篇文章主要介紹了VS中C#讀取app.config數(shù)據(jù)庫(kù)配置字符串的三種方法,需要的朋友可以參考下2015-10-10Unity3D開(kāi)發(fā)實(shí)戰(zhàn)之五子棋游戲
這篇文章主要為大家詳細(xì)介紹了Unity3D開(kāi)發(fā)實(shí)戰(zhàn)之五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09WPF應(yīng)用啟動(dòng)慢的問(wèn)題解決
今天碰到一個(gè)奇怪的現(xiàn)象,在某些機(jī)器上,進(jìn)行了系統(tǒng)還原后,WPF應(yīng)用打開(kāi)較慢,約有35s。本文先記錄下該問(wèn)題的解決方案,應(yīng)用啟動(dòng)性能官方文檔中有說(shuō)明,還有搜到的其它方案沒(méi)來(lái)得及測(cè)試,如NGEN update2021-05-05