我有一个针对不同目标框架编译的 .NET C# 项目。
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net461;net6.0-windows</TargetFrameworks>
...
VS 2022 中的单元测试(通过 Resharper 单元测试会话完成)访问当前进程的 StartInfo 在 4.6.1 上运行良好,但失败并出现 net.6.0 异常。
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 et461\ReSharperTestRunner.exe.
更新:这也发生在一个非常简单的控制台应用程序中:
// 有关详细信息,请参阅 https://aka.ms/new-console-template
using System.Diagnostics;
Console.WriteLine("Hello, World!");
using (Process process = Process.GetCurrentProcess())
{
if (process.StartInfo != null)
{
Console.WriteLine("Process.StartInfo found.");
}
}
OK,似乎从 Start() 未返回的进程中访问 StartInfo 是永远无效的...
https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.startinfo?view=net-6.0
您应该只访问 Start 方法返回的 Process 对象的 StartInfo 属性。例如,您不应访问 GetProcesses 返回的 Process 对象的 StartInfo 属性。 否则,在 .NET Core 上,StartInfo 属性将抛出 InvalidOperationException,而在 .NET Framework 上,它将返回一个虚拟的 ProcessStartInfo 对象.