.NET 6中Process.GetCurrentProcess().StartInfo抛InvalidOperationException问题
访问当前进程StartInfo在.NET 6下抛出异常的原因分析
项目配置
我有一个编译目标为多框架的.NET C#项目,项目配置如下:
<?xml version="1.0" encoding="utf-8"?> <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net461;net6.0-windows</TargetFrameworks> ... </Project>
问题现象
在VS 2022中通过Resharper单元测试会话执行单元测试时,访问当前进程的StartInfo在net461下正常,但在.NET 6下抛出异常。
测试代码:
using (Process process = Process.GetCurrentProcess()) { Assert.IsTrue(process.StartInfo != null); }
异常信息:
Test method HSBC.Diagnostics.Test.ProcessProxyTest.TestProcessProxy threw exception: System.InvalidOperationException: Process was not started by this object, so requested information cannot be determined. at System.Diagnostics.Process.get_StartInfo() ...
我发现两个平台使用的主模块均为...JetBrains\Installations\ReSharperPlatformVs17_95e6680d\TestRunner\net461\ReSharperTestRunner.exe。
复现情况(更新)
该问题在一个简单的控制台应用中也会出现,代码如下:
using System.Diagnostics; Console.WriteLine("Hello, World!"); using (Process process = Process.GetCurrentProcess()) { if (process.StartInfo != null) { Console.WriteLine("Process.StartInfo found."); } }
原因分析
这是.NET Framework与.NET Core/.NET 5+系列在System.Diagnostics.Process.StartInfo API设计上的行为差异导致的:
- .NET Framework(net461):即使进程不是由当前
Process实例启动(比如通过GetCurrentProcess()获取的当前进程),访问StartInfo也会返回一个默认实例(可能为空或包含部分系统默认值),不会抛出异常。 - .NET Core/.NET 6+:
StartInfo的设计仅针对由当前代码通过Process.Start()主动启动的进程实例有效。如果是获取外部进程或当前进程的Process实例,运行时无法可靠获取该进程的启动参数信息,因此访问StartInfo会直接抛出InvalidOperationException,这是明确API边界的设计变更,避免返回不准确的误导性信息。
虽然两个框架下的测试都使用了同一个ReSharper测试运行器主模块,但.NET 6的测试代码运行在.NET 6的运行时环境中,遵循.NET Core系列的API规则,因此触发了异常;而net461的测试代码遵循.NET Framework的旧行为逻辑,所以可以正常访问。
内容的提问来源于stack exchange,提问作者Udontknow
相关产品推荐
相关产品推荐

