diff --git a/PolyShim.Tests/Net70/ProcessTests.cs b/PolyShim.Tests/Net70/ProcessTests.cs
new file mode 100644
index 0000000..d3674c0
--- /dev/null
+++ b/PolyShim.Tests/Net70/ProcessTests.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Diagnostics;
+using FluentAssertions;
+using Xunit;
+
+namespace PolyShim.Tests.Net70;
+
+public class ProcessTests
+{
+ [Fact]
+ public void WaitForExit_TimeSpan_Test()
+ {
+ // Arrange
+ using var process = new Process
+ {
+ StartInfo = new ProcessStartInfo
+ {
+ FileName = OperatingSystem.IsWindows() ? "cmd" : "sleep",
+ Arguments = OperatingSystem.IsWindows() ? "/c timeout 1" : "1",
+ CreateNoWindow = true,
+ UseShellExecute = false,
+ },
+ };
+
+ process.Start();
+
+ // Act
+ var exited = process.WaitForExit(TimeSpan.FromSeconds(10));
+
+ // Assert
+ exited.Should().BeTrue();
+ process.HasExited.Should().BeTrue();
+ }
+
+ [Fact]
+ public void WaitForExit_TimeSpan_Timeout_Test()
+ {
+ // Arrange
+ using var process = new Process
+ {
+ StartInfo = new ProcessStartInfo
+ {
+ FileName = OperatingSystem.IsWindows() ? "cmd" : "sleep",
+ Arguments = OperatingSystem.IsWindows() ? "/c timeout 30 /nobreak" : "30",
+ CreateNoWindow = true,
+ UseShellExecute = false,
+ },
+ };
+ process.Start();
+
+ try
+ {
+ // Act
+ var exited = process.WaitForExit(TimeSpan.FromMilliseconds(100));
+
+ // Assert
+ exited.Should().BeFalse();
+ }
+ finally
+ {
+ process.Kill();
+ }
+ }
+}
diff --git a/PolyShim/Net70/Process.cs b/PolyShim/Net70/Process.cs
new file mode 100644
index 0000000..c6b6762
--- /dev/null
+++ b/PolyShim/Net70/Process.cs
@@ -0,0 +1,29 @@
+#if FEATURE_PROCESS
+#if (NETCOREAPP && !NET7_0_OR_GREATER) || (NETFRAMEWORK) || (NETSTANDARD)
+#nullable enable
+#pragma warning disable CS0436
+
+using System;
+using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
+
+#if !POLYSHIM_INCLUDE_COVERAGE
+[ExcludeFromCodeCoverage]
+#endif
+internal static class MemberPolyfills_Net70_Process
+{
+ extension(Process process)
+ {
+ // https://learn.microsoft.com/dotnet/api/system.diagnostics.process.waitforexit#system-diagnostics-process-waitforexit(system-timespan)
+ public bool WaitForExit(TimeSpan timeout)
+ {
+ var totalMilliseconds = (long)timeout.TotalMilliseconds;
+ if (totalMilliseconds < -1 || totalMilliseconds > int.MaxValue)
+ throw new ArgumentOutOfRangeException(nameof(timeout));
+
+ return process.WaitForExit((int)totalMilliseconds);
+ }
+ }
+}
+#endif
+#endif
diff --git a/Signatures.md b/Signatures.md
index fd4079b..b4836ca 100644
--- a/Signatures.md
+++ b/Signatures.md
@@ -1,8 +1,8 @@
# Signatures
-- **Total:** 487
+- **Total:** 488
- **Types:** 106
-- **Members:** 381
+- **Members:** 382
___
@@ -369,6 +369,7 @@ ___
- [`static string Join(params string?[])`](https://learn.microsoft.com/dotnet/api/system.io.path.join#system-io-path-join(system-string())) .NET Core 3.0
- [`static string TrimEndingDirectorySeparator(string)`](https://learn.microsoft.com/dotnet/api/system.io.path.trimendingdirectoryseparator#system-io-path-trimendingdirectoryseparator(system-string)) .NET Core 3.0
- `Process`
+ - [`bool WaitForExit(TimeSpan)`](https://learn.microsoft.com/dotnet/api/system.diagnostics.process.waitforexit#system-diagnostics-process-waitforexit(system-timespan)) .NET 7.0
- [`Task WaitForExitAsync(CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.diagnostics.process.waitforexitasync) .NET 5.0
- [`void Kill(bool)`](https://learn.microsoft.com/dotnet/api/system.diagnostics.process.kill#system-diagnostics-process-kill(system-boolean)) .NET Core 3.0
- `Queue`