C#生成exe并用process運行的流程步驟
前言
需要寫一個小程序來監(jiān)控桌面的情況,所以想到用cmd來運行exe監(jiān)控
一、生成exe
1.發(fā)布自包含版本
假設你已經(jīng)在 Visual Studio 中打開了項目,以下是發(fā)布自包含版本的步驟:
打開項目屬性:右鍵點擊項目 -> 屬性。
選擇“發(fā)布”選項卡。
選擇“自包含”:在“發(fā)布模式”下拉菜單中選擇“自包含”。
選擇目標運行時:選擇 win-x64 或適合的目標平臺。
發(fā)布項目:點擊“發(fā)布”。
發(fā)布完成后,你可以在發(fā)布的目錄中找到你的應用程序及其所有依賴項,然后將其復制到目標機器上運行即可。
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 命名空間中的類僅支持在傳統(tǒng)的 Windows 桌面應用程序(如基于 .NET Framework 的應用程序)中使用,而不是在 .NET Core 或 .NET 5+ 中使用。
FlaUI 庫使用 System.Management 來獲取某些系統(tǒng)信息,例如進程的主模塊文件路徑。在 .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調(diào)用exe
如果你在一個程序中使用 cmd 運行了一個 EXE 文件,而該 EXE 文件的執(zhí)行導致了你的程序無法繼續(xù)執(zhí)行,這可能是因為以下幾個原因:
子進程阻塞了父進程:
如果子進程(即你運行的 EXE 文件)沒有正確關閉,可能會導致父進程(即你的程序)被阻塞。
資源鎖定:
EXE 文件可能占用了某些資源(如文件句柄、內(nèi)存等),導致父進程無法繼續(xù)執(zhí)行。
無限循環(huán):
EXE 文件中可能存在無限循環(huán)或長時間運行的任務,導致它不會自動退出。
命令行掛起:
如果 EXE 文件在命令行中運行并且沒有退出,可能會導致命令行窗口一直保持打開狀態(tài),從而影響到父進程的繼續(xù)執(zhí)行。
1.解決方法
如果你希望在啟動一個外部 EXE 文件后讓主程序繼續(xù)執(zhí)行,而不等待 EXE 文件結束,可以使用 Process.Start 方法的非阻塞模式。這意味著啟動 EXE 文件后,你的程序將繼續(xù)執(zhí)行后續(xù)代碼。
以下是如何做到這一點的示例代碼:
示例代碼
使用 Process.Start 啟動 EXE 文件:
使用 Process.Start 方法啟動 EXE 文件,并設置 UseShellExecute 為 false。
設置 CreateNoWindow 為 true,以避免創(chuàng)建新的命令行窗口。
確保 EXE 文件在后臺運行:
使用 StartInfo.Arguments 來傳遞參數(shù),確保 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."); // 主程序繼續(xù)執(zhí)行后續(xù)代碼 Console.WriteLine("Parent program continues..."); // 示例:執(zhí)行其他操作 DoSomethingElse(); // 等待用戶輸入以保持控制臺窗口打開 Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } static void DoSomethingElse() { Console.WriteLine("Performing other tasks..."); // 這里可以執(zhí)行其他任務 } }
說明
1.啟動 EXE 文件:
使用 Process.Start(startInfo) 啟動 EXE 文件。這不會阻塞當前程序的執(zhí)行。
避免創(chuàng)建新窗口:
設置 CreateNoWindow = true 可以避免創(chuàng)建新的命令行窗口。
繼續(xù)執(zhí)行后續(xù)代碼:
2.啟動 EXE 文件后,程序將繼續(xù)執(zhí)行 Main 方法中的后續(xù)代碼。
3.測試
運行上述程序,你會看到:
輸出 “Starting EXE file…”
EXE 文件將在后臺啟動
輸出 “EXE file started in background.”
輸出 “Parent program continues…”
執(zhí)行其他任務
等待用戶輸入以保持控制臺窗口打開
以上就是C#生成exe并用process運行的流程步驟的詳細內(nèi)容,更多關于C#生成exe并運行的資料請關注腳本之家其它相關文章!
相關文章
VS中C#讀取app.config數(shù)據(jù)庫配置字符串的三種方法
這篇文章主要介紹了VS中C#讀取app.config數(shù)據(jù)庫配置字符串的三種方法,需要的朋友可以參考下2015-10-10