You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 18:15:19