diff --git a/src/Cli/dotnet/Commands/Run/RunCommand.cs b/src/Cli/dotnet/Commands/Run/RunCommand.cs index 542fc76ffbcd..9c11228ab213 100644 --- a/src/Cli/dotnet/Commands/Run/RunCommand.cs +++ b/src/Cli/dotnet/Commands/Run/RunCommand.cs @@ -538,6 +538,15 @@ internal static void ThrowUnableToRunError(ProjectInstance project) projectFileOrDirectoryPath = Directory.GetCurrentDirectory(); } + // Normalize path separators to handle Windows-style paths on non-Windows platforms. + // This is supported for backward compatibility in 'dotnet run' only, not for all CLI commands. + // Converting backslashes to forward slashes allows PowerShell scripts using Windows-style paths + // to work cross-platform, maintaining compatibility with .NET 9 behavior. + if (Path.DirectorySeparatorChar != '\\') + { + projectFileOrDirectoryPath = projectFileOrDirectoryPath.Replace('\\', '/'); + } + string? projectFilePath = Directory.Exists(projectFileOrDirectoryPath) ? TryFindSingleProjectInDirectory(projectFileOrDirectoryPath) : projectFileOrDirectoryPath; diff --git a/test/dotnet.Tests/CommandTests/Run/RunParserTests.cs b/test/dotnet.Tests/CommandTests/Run/RunParserTests.cs index 3c2897bbe34e..b47f27a41e5a 100644 --- a/test/dotnet.Tests/CommandTests/Run/RunParserTests.cs +++ b/test/dotnet.Tests/CommandTests/Run/RunParserTests.cs @@ -27,5 +27,35 @@ public void RunParserCanGetArgumentFromDoubleDash() var runCommand = RunCommand.FromArgs(new[] { "--project", projectPath, "--", "foo" }); runCommand.ApplicationArgs.Single().Should().Be("foo"); } + + [WindowsOnlyFact] + public void RunParserAcceptsWindowsPathSeparatorsOnWindows() + { + var tam = new TestAssetsManager(output); + var testAsset = tam.CopyTestAsset("HelloWorld").WithSource(); + var newWorkingDir = testAsset.Path; + + Directory.SetCurrentDirectory(newWorkingDir); + var projectPath = @".\HelloWorld.csproj"; + + // Should not throw on Windows + var runCommand = RunCommand.FromArgs(new[] { "--project", projectPath }); + runCommand.ProjectFileFullPath.Should().NotBeNull(); + } + + [UnixOnlyFact] + public void RunParserAcceptsWindowsPathSeparatorsOnLinux() + { + var tam = new TestAssetsManager(output); + var testAsset = tam.CopyTestAsset("HelloWorld").WithSource(); + var newWorkingDir = testAsset.Path; + + Directory.SetCurrentDirectory(newWorkingDir); + var projectPath = @".\HelloWorld.csproj"; + + // Should not throw on Linux with backslash separators + var runCommand = RunCommand.FromArgs(new[] { "--project", projectPath }); + runCommand.ProjectFileFullPath.Should().NotBeNull(); + } } }