From e4a9acd7674e5d40c90429e5d6403366dccb895c Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Fri, 2 May 2025 00:24:14 -0700 Subject: [PATCH 1/9] Revert change to follow symlinks of dotnet host https://github.com/dotnet/runtime/pull/99576 changed the host to first resolve symlinks before resolving the application directory. This means that relative loads happen relative to the pointed-at file, not the symbolic link. This was a breaking change made to match the symbolic link behavior on all platforms. Unfortunately, it seems a number of users have taken a dependency on the Windows-specific behavior. This PR reverts the change and puts back in place the old Windows behavior. --- src/native/corehost/corehost.cpp | 2 +- src/native/corehost/fxr_resolver.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/native/corehost/corehost.cpp b/src/native/corehost/corehost.cpp index c8a94312c5d6d4..c233a52237a9fb 100644 --- a/src/native/corehost/corehost.cpp +++ b/src/native/corehost/corehost.cpp @@ -115,7 +115,7 @@ int exe_start(const int argc, const pal::char_t* argv[]) // Use realpath to find the path of the host, resolving any symlinks. // hostfxr (for dotnet) and the app dll (for apphost) are found relative to the host. pal::string_t host_path; - if (!pal::get_own_executable_path(&host_path) || !pal::realpath(&host_path)) + if (!pal::get_own_executable_path(&host_path) || !pal::fullpath(&host_path)) { trace::error(_X("Failed to resolve full path of the current executable [%s]"), host_path.c_str()); return StatusCode::CoreHostCurHostFindFailure; diff --git a/src/native/corehost/fxr_resolver.cpp b/src/native/corehost/fxr_resolver.cpp index a69bf7ced896a5..0d1cbddf9deb5c 100644 --- a/src/native/corehost/fxr_resolver.cpp +++ b/src/native/corehost/fxr_resolver.cpp @@ -95,7 +95,7 @@ bool fxr_resolver::try_get_path( bool search_global = (search & search_location_global) != 0; pal::string_t default_install_location; pal::string_t dotnet_root_env_var_name; - if (search_app_relative && pal::realpath(app_relative_dotnet_root)) + if (search_app_relative && pal::fullpath(app_relative_dotnet_root)) { trace::info(_X("Using app-relative location [%s] as runtime location."), app_relative_dotnet_root->c_str()); out_dotnet_root->assign(*app_relative_dotnet_root); From 99fd837431f4cf893fbaeba9444e06682f0413e2 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Mon, 5 May 2025 15:38:11 -0700 Subject: [PATCH 2/9] Adapt symbolic link tests --- .../tests/HostActivation.Tests/SymbolicLinks.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs index d440d3eae2caa2..8e7fe336f8190f 100644 --- a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs +++ b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs @@ -37,8 +37,8 @@ public void Run_apphost_behind_symlink(string symlinkRelativePath) .CaptureStdErr() .CaptureStdOut() .Execute() - .Should().Pass() - .And.HaveStdOutContaining("Hello World"); + .Should().Fail() + .And.HaveStdErrContaining("The application to execute does not exist"); } } @@ -67,8 +67,8 @@ public void Run_apphost_behind_transitive_symlinks(string firstSymlinkRelativePa .CaptureStdErr() .CaptureStdOut() .Execute() - .Should().Pass() - .And.HaveStdOutContaining("Hello World"); + .Should().Fail() + .And.HaveStdErrContaining("The application to execute does not exist"); } } @@ -91,8 +91,8 @@ public void Run_framework_dependent_app_behind_symlink(string symlinkRelativePat .CaptureStdOut() .DotNetRoot(TestContext.BuiltDotNet.BinPath) .Execute() - .Should().Pass() - .And.HaveStdOutContaining("Hello World"); + .Should().Fail() + .And.HaveStdErrContaining("The application to execute does not exist"); } } @@ -148,8 +148,8 @@ public void Put_dotnet_behind_symlink() .CaptureStdErr() .CaptureStdOut() .Execute() - .Should().Pass() - .And.HaveStdOutContaining("Hello World"); + .Should().Fail() + .And.HaveStdErrContaining($"[{Path.Combine(testDir.Location, "host", "fxr")}] does not exist"); } } From ed2e7b45ac1c99a35d9e4299b48a1ba2ccf306d6 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Tue, 6 May 2025 13:59:04 -0700 Subject: [PATCH 3/9] Conditional behavior based on OS --- .../HostActivation.Tests/SymbolicLinks.cs | 77 +++++++++++++++---- 1 file changed, 61 insertions(+), 16 deletions(-) diff --git a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs index 8e7fe336f8190f..90d1c9a7c6046a 100644 --- a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs +++ b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs @@ -4,6 +4,7 @@ using System; using System.IO; using System.Linq; +using System.Runtime.InteropServices; using FluentAssertions; using Microsoft.DotNet.Cli.Build.Framework; @@ -33,12 +34,23 @@ public void Run_apphost_behind_symlink(string symlinkRelativePath) var symlinkFullPath = Path.Combine(testDir.Location, symlinkRelativePath); using var symlink = new SymLink(symlinkFullPath, sharedTestState.SelfContainedApp.AppExe); - Command.Create(symlinkFullPath) + var result = Command.Create(symlinkFullPath) .CaptureStdErr() .CaptureStdOut() - .Execute() - .Should().Fail() - .And.HaveStdErrContaining("The application to execute does not exist"); + .Execute(); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + result + .Should().Fail() + .And.HaveStdErrContaining("The application to execute does not exist"); + } + else + { + result + .Should().Pass() + .And.HaveStdOutContaining("Hello World"); + } } } @@ -63,12 +75,23 @@ public void Run_apphost_behind_transitive_symlinks(string firstSymlinkRelativePa Directory.CreateDirectory(Path.GetDirectoryName(symlink1Path)); using var symlink1 = new SymLink(symlink1Path, symlink2Path); - Command.Create(symlink1.SrcPath) + var result = Command.Create(symlink1.SrcPath) .CaptureStdErr() .CaptureStdOut() - .Execute() - .Should().Fail() - .And.HaveStdErrContaining("The application to execute does not exist"); + .Execute(); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + result + .Should().Fail() + .And.HaveStdErrContaining("The application to execute does not exist"); + } + else + { + result + .Should().Pass() + .And.HaveStdOutContaining("Hello World"); + } } } @@ -86,13 +109,24 @@ public void Run_framework_dependent_app_behind_symlink(string symlinkRelativePat Directory.CreateDirectory(Path.Combine(testDir.Location, Path.GetDirectoryName(symlinkRelativePath))); using var symlink = new SymLink(Path.Combine(testDir.Location, symlinkRelativePath), sharedTestState.FrameworkDependentApp.AppExe); - Command.Create(symlink.SrcPath) + var result = Command.Create(symlink.SrcPath) .CaptureStdErr() .CaptureStdOut() .DotNetRoot(TestContext.BuiltDotNet.BinPath) - .Execute() - .Should().Fail() - .And.HaveStdErrContaining("The application to execute does not exist"); + .Execute(); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + result + .Should().Fail() + .And.HaveStdErrContaining("The application to execute does not exist"); + } + else + { + result + .Should().Pass() + .And.HaveStdOutContaining("Hello World"); + } } } @@ -144,12 +178,23 @@ public void Put_dotnet_behind_symlink() var dotnetSymlink = Path.Combine(testDir.Location, Binaries.DotNet.FileName); using var symlink = new SymLink(dotnetSymlink, TestContext.BuiltDotNet.DotnetExecutablePath); - Command.Create(symlink.SrcPath, sharedTestState.SelfContainedApp.AppDll) + var result = Command.Create(symlink.SrcPath, sharedTestState.SelfContainedApp.AppDll) .CaptureStdErr() .CaptureStdOut() - .Execute() - .Should().Fail() - .And.HaveStdErrContaining($"[{Path.Combine(testDir.Location, "host", "fxr")}] does not exist"); + .Execute(); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + result + .Should().Fail() + .And.HaveStdErrContaining($"[{Path.Combine(testDir.Location, "host", "fxr")}] does not exist"); + } + else + { + result + .Should().Pass() + .And.HaveStdOutContaining("Hello World"); + } } } From a6c282a0aa1a9644a864f5645c255f7a655c6ca5 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Mon, 12 May 2025 20:35:58 -0700 Subject: [PATCH 4/9] Add unit test for success with symlinks --- .../HostActivation.Tests/SymbolicLinks.cs | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs index 90d1c9a7c6046a..7b735896140baf 100644 --- a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs +++ b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; @@ -22,6 +23,48 @@ public SymbolicLinks(SymbolicLinks.SharedTestState fixture) sharedTestState = fixture; } + [Theory] + [InlineData("a/b/SymlinkToFrameworkDependentApp")] + [InlineData("a/SymlinkToFrameworkDependentApp")] + public void Symlink_all_files(string symlinkRelativePath) + { + using var testDir = TestArtifact.Create("symlink"); + Directory.CreateDirectory(Path.Combine(testDir.Location, Path.GetDirectoryName(symlinkRelativePath))); + + // Symlink every file in the app directory + var symlinks = new List(); + try + { + foreach (var file in Directory.EnumerateFiles(sharedTestState.FrameworkDependentApp.Location)) + { + var fileName = Path.GetFileName(file); + var symlinkPath = Path.Combine(testDir.Location, symlinkRelativePath, fileName); + Directory.CreateDirectory(Path.GetDirectoryName(symlinkPath)); + symlinks.Add(new SymLink(symlinkPath, file)); + } + + var result = Command.Create(Path.Combine(testDir.Location, symlinkRelativePath, Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe))) + .CaptureStdErr() + .CaptureStdOut() + .DotNetRoot(TestContext.BuiltDotNet.BinPath) + .Execute(); + + // This should succeed on all platforms, but for different reasons: + // * Windows: The apphost will look next to the symlink for the app dll and find the symlinked dll + // * Unix: The apphost will look next to the resolved apphost for the app dll and find the real thing + result + .Should().Pass() + .And.HaveStdOutContaining("Hello World"); + } + finally + { + foreach (var symlink in symlinks) + { + symlink.Dispose(); + } + } + } + [Theory] [InlineData ("a/b/SymlinkToApphost")] [InlineData ("a/SymlinkToApphost")] From 381ed56bd339ea302b0a31b80e71815a43763928 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Mon, 12 May 2025 20:37:05 -0700 Subject: [PATCH 5/9] Add self-contained test as well --- .../HostActivation.Tests/SymbolicLinks.cs | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs index 7b735896140baf..8ca17401307838 100644 --- a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs +++ b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs @@ -26,7 +26,7 @@ public SymbolicLinks(SymbolicLinks.SharedTestState fixture) [Theory] [InlineData("a/b/SymlinkToFrameworkDependentApp")] [InlineData("a/SymlinkToFrameworkDependentApp")] - public void Symlink_all_files(string symlinkRelativePath) + public void Symlink_all_files_fx(string symlinkRelativePath) { using var testDir = TestArtifact.Create("symlink"); Directory.CreateDirectory(Path.Combine(testDir.Location, Path.GetDirectoryName(symlinkRelativePath))); @@ -65,6 +65,48 @@ public void Symlink_all_files(string symlinkRelativePath) } } + [Theory] + [InlineData("a/b/SymlinkToFrameworkDependentApp")] + [InlineData("a/SymlinkToFrameworkDependentApp")] + public void Symlink_all_files_self_contained(string symlinkRelativePath) + { + using var testDir = TestArtifact.Create("symlink"); + Directory.CreateDirectory(Path.Combine(testDir.Location, Path.GetDirectoryName(symlinkRelativePath))); + + // Symlink every file in the app directory + var symlinks = new List(); + try + { + foreach (var file in Directory.EnumerateFiles(sharedTestState.SelfContainedApp.Location)) + { + var fileName = Path.GetFileName(file); + var symlinkPath = Path.Combine(testDir.Location, symlinkRelativePath, fileName); + Directory.CreateDirectory(Path.GetDirectoryName(symlinkPath)); + symlinks.Add(new SymLink(symlinkPath, file)); + } + + var result = Command.Create(Path.Combine(testDir.Location, symlinkRelativePath, Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe))) + .CaptureStdErr() + .CaptureStdOut() + .DotNetRoot(TestContext.BuiltDotNet.BinPath) + .Execute(); + + // This should succeed on all platforms, but for different reasons: + // * Windows: The apphost will look next to the symlink for the files and find the symlinks + // * Unix: The apphost will look next to the resolved apphost for the files and find the real thing + result + .Should().Pass() + .And.HaveStdOutContaining("Hello World"); + } + finally + { + foreach (var symlink in symlinks) + { + symlink.Dispose(); + } + } + } + [Theory] [InlineData ("a/b/SymlinkToApphost")] [InlineData ("a/SymlinkToApphost")] From 0d73fbc5f829c4f7dd0c3a9293c3d561d89180f2 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Wed, 28 May 2025 14:48:22 -0700 Subject: [PATCH 6/9] Add test with split files --- .../HostActivation.Tests/SymbolicLinks.cs | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs index 8ca17401307838..2dcb929f70a528 100644 --- a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs +++ b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs @@ -65,6 +65,79 @@ public void Symlink_all_files_fx(string symlinkRelativePath) } } + [Theory] + [InlineData("a/b/SymlinkToFrameworkDependentApp")] + [InlineData("a/SymlinkToFrameworkDependentApp")] + public void Symlink_split_files_fx(string symlinkRelativePath) + { + using var testDir = TestArtifact.Create("symlink"); + + // Split the app into two directories, one for the apphost and one for the rest of the files + var appHostDir = Path.Combine(testDir.Location, "apphost"); + var appFilesDir = Path.Combine(testDir.Location, "appfiles"); + Directory.CreateDirectory(appHostDir); + Directory.CreateDirectory(appFilesDir); + + File.Copy( + Path.Combine(sharedTestState.FrameworkDependentApp.Location, sharedTestState.FrameworkDependentApp.AppExe), + Path.Combine(appHostDir, Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe))); + + foreach (var file in Directory.EnumerateFiles(sharedTestState.FrameworkDependentApp.Location)) + { + var fileName = Path.GetFileName(file); + if (fileName != sharedTestState.FrameworkDependentApp.AppExe) + { + File.Copy(file, Path.Combine(appFilesDir, fileName)); + } + } + + // Symlink all of the above into a single directory + var targetPath = Path.Combine(testDir.Location, Path.GetDirectoryName(symlinkRelativePath)); + Directory.CreateDirectory(targetPath); + var symlinks = new List(); + try + { + foreach (var file in Directory.EnumerateFiles(appFilesDir)) + { + var fileName = Path.GetFileName(file); + var symlinkPath = Path.Combine(targetPath, symlinkRelativePath, fileName); + Directory.CreateDirectory(Path.GetDirectoryName(symlinkPath)); + symlinks.Add(new SymLink(file, symlinkPath)); + } + symlinks.Add(new SymLink( + Path.Combine(appHostDir, Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe)), + Path.Combine(targetPath, symlinkRelativePath, Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe)))); + + var result = Command.Create(Path.Combine(testDir.Location, symlinkRelativePath, Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe))) + .CaptureStdErr() + .CaptureStdOut() + .DotNetRoot(TestContext.BuiltDotNet.BinPath) + .Execute(); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + // On Windows, the apphost will look next to the symlink for the app dll and find the symlinks + result + .Should().Pass() + .And.HaveStdOutContaining("Hello World"); + } + else + { + // On Unix, the apphost will not find the app files next to the symlink + result + .Should().Fail() + .And.HaveStdErrContaining("The application to execute does not exist"); + } + } + finally + { + foreach (var symlink in symlinks) + { + symlink.Dispose(); + } + } + } + [Theory] [InlineData("a/b/SymlinkToFrameworkDependentApp")] [InlineData("a/SymlinkToFrameworkDependentApp")] From c2f5e15e40bc8365ea476a276c675d33cfbf8ed6 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Wed, 28 May 2025 14:56:52 -0700 Subject: [PATCH 7/9] Simplify dir handling --- src/installer/tests/HostActivation.Tests/SymbolicLinks.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs index 2dcb929f70a528..ecd9280c834458 100644 --- a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs +++ b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs @@ -92,7 +92,7 @@ public void Symlink_split_files_fx(string symlinkRelativePath) } // Symlink all of the above into a single directory - var targetPath = Path.Combine(testDir.Location, Path.GetDirectoryName(symlinkRelativePath)); + var targetPath = Path.Combine(testDir.Location, symlinkRelativePath); Directory.CreateDirectory(targetPath); var symlinks = new List(); try @@ -100,15 +100,15 @@ public void Symlink_split_files_fx(string symlinkRelativePath) foreach (var file in Directory.EnumerateFiles(appFilesDir)) { var fileName = Path.GetFileName(file); - var symlinkPath = Path.Combine(targetPath, symlinkRelativePath, fileName); + var symlinkPath = Path.Combine(targetPath, fileName); Directory.CreateDirectory(Path.GetDirectoryName(symlinkPath)); symlinks.Add(new SymLink(file, symlinkPath)); } symlinks.Add(new SymLink( Path.Combine(appHostDir, Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe)), - Path.Combine(targetPath, symlinkRelativePath, Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe)))); + Path.Combine(targetPath, Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe)))); - var result = Command.Create(Path.Combine(testDir.Location, symlinkRelativePath, Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe))) + var result = Command.Create(Path.Combine(targetPath, Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe))) .CaptureStdErr() .CaptureStdOut() .DotNetRoot(TestContext.BuiltDotNet.BinPath) From 20e7f776ddb1827564528954e2f9bba199d57585 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Mon, 2 Jun 2025 19:55:46 -0700 Subject: [PATCH 8/9] Simplify test code --- .../tests/HostActivation.Tests/SymbolicLinks.cs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs index ecd9280c834458..0ae2fa863dc7aa 100644 --- a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs +++ b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs @@ -78,14 +78,16 @@ public void Symlink_split_files_fx(string symlinkRelativePath) Directory.CreateDirectory(appHostDir); Directory.CreateDirectory(appFilesDir); + var appHostName = Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe); + File.Copy( - Path.Combine(sharedTestState.FrameworkDependentApp.Location, sharedTestState.FrameworkDependentApp.AppExe), - Path.Combine(appHostDir, Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe))); + sharedTestState.FrameworkDependentApp.AppExe, + Path.Combine(appHostDir, appHostName)); foreach (var file in Directory.EnumerateFiles(sharedTestState.FrameworkDependentApp.Location)) { var fileName = Path.GetFileName(file); - if (fileName != sharedTestState.FrameworkDependentApp.AppExe) + if (fileName != appHostName) { File.Copy(file, Path.Combine(appFilesDir, fileName)); } @@ -102,13 +104,14 @@ public void Symlink_split_files_fx(string symlinkRelativePath) var fileName = Path.GetFileName(file); var symlinkPath = Path.Combine(targetPath, fileName); Directory.CreateDirectory(Path.GetDirectoryName(symlinkPath)); - symlinks.Add(new SymLink(file, symlinkPath)); + symlinks.Add(new SymLink(symlinkPath, file)); } symlinks.Add(new SymLink( - Path.Combine(appHostDir, Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe)), - Path.Combine(targetPath, Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe)))); + Path.Combine(targetPath, appHostName), + Path.Combine(appHostDir, appHostName))); - var result = Command.Create(Path.Combine(targetPath, Path.GetFileName(sharedTestState.FrameworkDependentApp.AppExe))) + Console.ReadLine(); + var result = Command.Create(Path.Combine(targetPath, appHostName)) .CaptureStdErr() .CaptureStdOut() .DotNetRoot(TestContext.BuiltDotNet.BinPath) From d70a43818e2fc92c3c86fe0e24e248e9e14dee99 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Fri, 6 Jun 2025 20:04:59 -0700 Subject: [PATCH 9/9] Remove debugging line --- src/installer/tests/HostActivation.Tests/SymbolicLinks.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs index 0ae2fa863dc7aa..5afab32a0881d2 100644 --- a/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs +++ b/src/installer/tests/HostActivation.Tests/SymbolicLinks.cs @@ -110,7 +110,6 @@ public void Symlink_split_files_fx(string symlinkRelativePath) Path.Combine(targetPath, appHostName), Path.Combine(appHostDir, appHostName))); - Console.ReadLine(); var result = Command.Create(Path.Combine(targetPath, appHostName)) .CaptureStdErr() .CaptureStdOut()