gpt4 book ai didi

c# - 如何在 C# 中获取二进制文件的路径?

转载 作者:行者123 更新时间:2023-11-30 22:17:37 25 4
gpt4 key购买 nike

出于某些报告目的,我正在尝试获取某个二进制文件的位置。

我正在这样做,并且它正在工作,但是当我尝试获取 testProc.MainModule.FileName 时,我现在得到一个 NullReferenceException;而且我认为可能是程序在我能够捕获它之前就关闭了。有没有更好的方法来做到这一点?

ProcessStartInfo testPSI = new ProcessStartInfo(RunOptions.TestBinary);
testPSI.RedirectStandardError = true;
testPSI.RedirectStandardOutput = true;
testPSI.UseShellExecute = false;
Process testProc = new Process();
testProc.StartInfo = testPSI;
testProc.Start();
ret = testProc.MainModule.FileName;
testProc.Kill();
if (ret != null)
return ret;

最佳答案

选项 1:使用您已有的路径。

除非我遗漏了什么,否则看起来您正在自己创建进程(使用 RunOptions.TestBinary),因此您应该已经知道路径。您可以使用 Path.GetFullPath(RunOptions.TestBinary) 获取可执行文件的完整路径,或者如果二进制文件位于 PATH 上,您可以手动检查每个目录以确定从哪里执行二进制文件。

选项 2:使用 C# 的 WMI库:

如果测试主机进程和正在执行的进程之间存在位数(32 位/64 位)差异,则枚举模块和获取文件名将不起作用。但是,您可以使用 WMI 来绕过此限制。

添加对 System.Management 的引用并尝试以下操作(警告:无错误处理):

static string GetImagePath(int processId)
{
string query = string.Format("SELECT ExecutablePath FROM Win32_Process WHERE ProcessID='{0}'", processId);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection results = searcher.Get();
ManagementObject process = results.Cast<ManagementObject>().First();
return (string)process["ExecutablePath"];
}

选项 3:向目标进程添加同步:

如果这确实是一个时间问题(即,在测试进程可以检查它之前,受监视的进程正在死亡),那么您可以在两个进程之间添加一些同步(例如命名互斥锁)。如果你真的想深入挖掘,你可以使用 ETW捕获进程启动事件(见下文)。

选项 4:使用 the TraceEvent .NET library捕获进程启动事件。

Vance Morrison(编写 TraceEvent 库的人)有 an in-depth article关于如何捕获进程启动事件。此解决方案确实需要引入一堆依赖项,但由于它使用 ETW,因此不会出现计时问题(即使进程快速终止,进程启动事件仍会触发)。这是迄今为止最复杂的解决方案。

关于c# - 如何在 C# 中获取二进制文件的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16660865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com