Skip to content

Commit 3aa5e3f

Browse files
author
Jason Zhai
committed
Merge branch 'release/9.0.3xx' of https://github.com/dotnet/sdk into merge/release/9.0.2xx-to-release/9.0.3xx
2 parents 1cbaff0 + c905718 commit 3aa5e3f

File tree

74 files changed

+1507
-969
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+1507
-969
lines changed

NuGet.config

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,18 @@
2424
<!-- Begin: Package sources from dotnet-aspire -->
2525
<!-- End: Package sources from dotnet-aspire -->
2626
<!-- Begin: Package sources from dotnet-aspnetcore -->
27-
<add key="darc-int-dotnet-aspnetcore-704f7cb" value="https://pkgs.dev.azure.com/dnceng/internal/_packaging/darc-int-dotnet-aspnetcore-704f7cb1/nuget/v3/index.json" />
2827
<!-- End: Package sources from dotnet-aspnetcore -->
2928
<!-- Begin: Package sources from dotnet-emsdk -->
30-
<add key="darc-pub-dotnet-emsdk-2c27e40" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-emsdk-2c27e405/nuget/v3/index.json" />
3129
<!-- End: Package sources from dotnet-emsdk -->
3230
<!-- Begin: Package sources from DotNet-msbuild-Trusted -->
33-
<add key="darc-pub-DotNet-msbuild-Trusted-1ea1660" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-DotNet-msbuild-Trusted-1ea16607/nuget/v3/index.json" />
3431
<!-- End: Package sources from DotNet-msbuild-Trusted -->
3532
<!-- Begin: Package sources from dotnet-roslyn-analyzers -->
3633
<!-- End: Package sources from dotnet-roslyn-analyzers -->
3734
<!-- Begin: Package sources from dotnet-runtime -->
38-
<add key="darc-int-dotnet-runtime-80aa709" value="https://pkgs.dev.azure.com/dnceng/internal/_packaging/darc-int-dotnet-runtime-80aa709f/nuget/v3/index.json" />
3935
<!-- End: Package sources from dotnet-runtime -->
4036
<!-- Begin: Package sources from dotnet-templating -->
41-
<add key="darc-pub-dotnet-templating-8c5b547" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-templating-8c5b547a/nuget/v3/index.json" />
4237
<!-- End: Package sources from dotnet-templating -->
4338
<!-- Begin: Package sources from dotnet-windowsdesktop -->
44-
<add key="darc-int-dotnet-windowsdesktop-f971ec2" value="https://pkgs.dev.azure.com/dnceng/internal/_packaging/darc-int-dotnet-windowsdesktop-f971ec24/nuget/v3/index.json" />
4539
<!-- End: Package sources from dotnet-windowsdesktop -->
4640
<!--End: Package sources managed by Dependency Flow automation. Do not edit the sources above.-->
4741
<add key="dotnet6" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json" />
@@ -68,13 +62,10 @@
6862
<!-- Begin: Package sources from dotnet-templating -->
6963
<!-- End: Package sources from dotnet-templating -->
7064
<!-- Begin: Package sources from dotnet-aspnetcore -->
71-
<add key="darc-int-dotnet-aspnetcore-704f7cb" value="true" />
7265
<!-- End: Package sources from dotnet-aspnetcore -->
7366
<!-- Begin: Package sources from dotnet-runtime -->
74-
<add key="darc-int-dotnet-runtime-80aa709" value="true" />
7567
<!-- End: Package sources from dotnet-runtime -->
7668
<!-- Begin: Package sources from dotnet-windowsdesktop -->
77-
<add key="darc-int-dotnet-windowsdesktop-f971ec2" value="true" />
7869
<!-- End: Package sources from dotnet-windowsdesktop -->
7970
<!--End: Package sources managed by Dependency Flow automation. Do not edit the sources above.-->
8071
</disabledPackageSources>

eng/Version.Details.xml

Lines changed: 213 additions & 213 deletions
Large diffs are not rendered by default.

eng/Versions.props

Lines changed: 92 additions & 92 deletions
Large diffs are not rendered by default.

sdk.sln

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.DotNet.HotReload.
516516
EndProject
517517
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.DotNet.HotReload.Agent.PipeRpc", "src\BuiltInTools\HotReloadAgent.PipeRpc\Microsoft.DotNet.HotReload.Agent.PipeRpc.shproj", "{FA3C7F91-42A2-45AD-897C-F646B081016C}"
518518
EndProject
519+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.DotNet.HotReload.Agent.Data.Package", "src\BuiltInTools\HotReloadAgent.Data\Microsoft.DotNet.HotReload.Agent.Data.Package.csproj", "{3DF5A9B8-6F90-4CFB-4518-0E97982B6748}"
520+
EndProject
521+
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.DotNet.HotReload.Agent.Data", "src\BuiltInTools\HotReloadAgent.Data\Microsoft.DotNet.HotReload.Agent.Data.shproj", "{0762B436-F4B0-4008-9097-BB5FF6BD84AF}"
522+
EndProject
519523
Global
520524
GlobalSection(SolutionConfigurationPlatforms) = preSolution
521525
Debug|Any CPU = Debug|Any CPU
@@ -978,6 +982,10 @@ Global
978982
{692B71D8-9C31-D1EE-6C1B-570A12B18E39}.Debug|Any CPU.Build.0 = Debug|Any CPU
979983
{692B71D8-9C31-D1EE-6C1B-570A12B18E39}.Release|Any CPU.ActiveCfg = Release|Any CPU
980984
{692B71D8-9C31-D1EE-6C1B-570A12B18E39}.Release|Any CPU.Build.0 = Release|Any CPU
985+
{3DF5A9B8-6F90-4CFB-4518-0E97982B6748}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
986+
{3DF5A9B8-6F90-4CFB-4518-0E97982B6748}.Debug|Any CPU.Build.0 = Debug|Any CPU
987+
{3DF5A9B8-6F90-4CFB-4518-0E97982B6748}.Release|Any CPU.ActiveCfg = Release|Any CPU
988+
{3DF5A9B8-6F90-4CFB-4518-0E97982B6748}.Release|Any CPU.Build.0 = Release|Any CPU
981989
EndGlobalSection
982990
GlobalSection(SolutionProperties) = preSolution
983991
HideSolutionNode = FALSE
@@ -1159,19 +1167,26 @@ Global
11591167
{2FF79F82-60C1-349A-4726-7783D5A6D5DF} = {71A9F549-0EB6-41F9-BC16-4A6C5007FC91}
11601168
{692B71D8-9C31-D1EE-6C1B-570A12B18E39} = {71A9F549-0EB6-41F9-BC16-4A6C5007FC91}
11611169
{FA3C7F91-42A2-45AD-897C-F646B081016C} = {71A9F549-0EB6-41F9-BC16-4A6C5007FC91}
1170+
{3DF5A9B8-6F90-4CFB-4518-0E97982B6748} = {71A9F549-0EB6-41F9-BC16-4A6C5007FC91}
1171+
{0762B436-F4B0-4008-9097-BB5FF6BD84AF} = {71A9F549-0EB6-41F9-BC16-4A6C5007FC91}
11621172
EndGlobalSection
11631173
GlobalSection(ExtensibilityGlobals) = postSolution
11641174
SolutionGuid = {FB8F26CE-4DE6-433F-B32A-79183020BBD6}
11651175
EndGlobalSection
11661176
GlobalSection(SharedMSBuildProjectFiles) = preSolution
11671177
src\Compatibility\ApiCompat\Microsoft.DotNet.ApiCompat.Shared\Microsoft.DotNet.ApiCompat.Shared.projitems*{03c5a84a-982b-4f38-ac73-ab832c645c4a}*SharedItemsImports = 5
1178+
src\BuiltInTools\HotReloadAgent.Data\Microsoft.DotNet.HotReload.Agent.Data.projitems*{0762b436-f4b0-4008-9097-bb5ff6bd84af}*SharedItemsImports = 13
11681179
src\Compatibility\ApiCompat\Microsoft.DotNet.ApiCompat.Shared\Microsoft.DotNet.ApiCompat.Shared.projitems*{0a3c9afd-f6e6-4a5d-83fb-93bf66732696}*SharedItemsImports = 5
1180+
src\BuiltInTools\HotReloadAgent.Data\Microsoft.DotNet.HotReload.Agent.Data.projitems*{1bbfa19c-03f0-4d27-9d0d-0f8172642107}*SharedItemsImports = 5
11691181
src\BuiltInTools\HotReloadAgent.PipeRpc\Microsoft.DotNet.HotReload.Agent.PipeRpc.projitems*{1bbfa19c-03f0-4d27-9d0d-0f8172642107}*SharedItemsImports = 5
11701182
src\BuiltInTools\HotReloadAgent\Microsoft.DotNet.HotReload.Agent.projitems*{1bbfa19c-03f0-4d27-9d0d-0f8172642107}*SharedItemsImports = 5
11711183
src\BuiltInTools\AspireService\Microsoft.WebTools.AspireService.projitems*{1f0b4b3c-dc88-4740-b04f-1707102e9930}*SharedItemsImports = 5
1184+
src\BuiltInTools\HotReloadAgent.Data\Microsoft.DotNet.HotReload.Agent.Data.projitems*{2ff79f82-60c1-349a-4726-7783d5a6d5df}*SharedItemsImports = 5
11721185
src\BuiltInTools\HotReloadAgent\Microsoft.DotNet.HotReload.Agent.projitems*{418b10bd-ca42-49f3-8f4a-d8cc90c8a17d}*SharedItemsImports = 13
11731186
src\BuiltInTools\AspireService\Microsoft.WebTools.AspireService.projitems*{445efbd5-6730-4f09-943d-278e77501ffd}*SharedItemsImports = 5
1187+
src\BuiltInTools\HotReloadAgent.Data\Microsoft.DotNet.HotReload.Agent.Data.projitems*{445efbd5-6730-4f09-943d-278e77501ffd}*SharedItemsImports = 5
11741188
src\BuiltInTools\HotReloadAgent.PipeRpc\Microsoft.DotNet.HotReload.Agent.PipeRpc.projitems*{445efbd5-6730-4f09-943d-278e77501ffd}*SharedItemsImports = 5
1189+
src\BuiltInTools\HotReloadAgent.Data\Microsoft.DotNet.HotReload.Agent.Data.projitems*{692b71d8-9c31-d1ee-6c1b-570a12b18e39}*SharedItemsImports = 5
11751190
src\BuiltInTools\AspireService\Microsoft.WebTools.AspireService.projitems*{94c8526e-dcc2-442f-9868-3dd0ba2688be}*SharedItemsImports = 13
11761191
src\Compatibility\ApiCompat\Microsoft.DotNet.ApiCompat.Shared\Microsoft.DotNet.ApiCompat.Shared.projitems*{9d36039f-d0a1-462f-85b4-81763c6b02cb}*SharedItemsImports = 13
11771192
src\Compatibility\ApiCompat\Microsoft.DotNet.ApiCompat.Shared\Microsoft.DotNet.ApiCompat.Shared.projitems*{a9103b98-d888-4260-8a05-fa36f640698a}*SharedItemsImports = 5

src/BuiltInTools/DotNetDeltaApplier/Microsoft.Extensions.DotNetDeltaApplier.csproj

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<Import Project="..\HotReloadAgent\Microsoft.DotNet.HotReload.Agent.projitems" Label="Shared" />
3+
<Import Project="..\HotReloadAgent.Data\Microsoft.DotNet.HotReload.Agent.Data.projitems" Label="Shared" />
34
<Import Project="..\HotReloadAgent.PipeRpc\Microsoft.DotNet.HotReload.Agent.PipeRpc.projitems" Label="Shared" />
45
<PropertyGroup>
56
<!--
@@ -9,13 +10,15 @@
910
<TargetFramework>netstandard2.1</TargetFramework>
1011
<StrongNameKeyId>MicrosoftAspNetCore</StrongNameKeyId>
1112

12-
<IsPackable>false</IsPackable>
1313
<Nullable>enable</Nullable>
14-
</PropertyGroup>
1514

16-
<ItemGroup>
17-
<Compile Include="..\dotnet-watch\EnvironmentVariables_StartupHook.cs" Link="EnvironmentVariables_StartupHook.cs" />
18-
</ItemGroup>
15+
<!-- NuGet -->
16+
<IsPackable>true</IsPackable>
17+
<PackageId>Microsoft.DotNet.HotReload.Agent.Host</PackageId>
18+
<PackageDescription>
19+
Package containing Hot Reload agent host.
20+
</PackageDescription>
21+
</PropertyGroup>
1922

2023
<ItemGroup>
2124
<InternalsVisibleTo Include="Microsoft.Extensions.DotNetDeltaApplier.Tests" />

src/BuiltInTools/DotNetDeltaApplier/StartupHook.cs

Lines changed: 134 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System.Diagnostics;
45
using System.IO.Pipes;
5-
using Microsoft.DotNet.Watch;
66
using Microsoft.DotNet.HotReload;
77

88
/// <summary>
99
/// The runtime startup hook looks for top-level type named "StartupHook".
1010
/// </summary>
1111
internal sealed class StartupHook
1212
{
13-
private static readonly bool s_logToStandardOutput = Environment.GetEnvironmentVariable(EnvironmentVariables.Names.HotReloadDeltaClientLogMessages) == "1";
14-
private static readonly string s_namedPipeName = Environment.GetEnvironmentVariable(EnvironmentVariables.Names.DotnetWatchHotReloadNamedPipeName);
13+
private const int ConnectionTimeoutMS = 5000;
14+
15+
private static readonly bool s_logToStandardOutput = Environment.GetEnvironmentVariable(AgentEnvironmentVariables.HotReloadDeltaClientLogMessages) == "1";
16+
private static readonly string s_namedPipeName = Environment.GetEnvironmentVariable(AgentEnvironmentVariables.DotNetWatchHotReloadNamedPipeName);
1517

1618
/// <summary>
1719
/// Invoked by the runtime when the containing assembly is listed in DOTNET_STARTUP_HOOKS.
@@ -22,65 +24,148 @@ public static void Initialize()
2224

2325
Log($"Loaded into process: {processPath}");
2426

25-
ClearHotReloadEnvironmentVariables();
27+
HotReloadAgent.ClearHotReloadEnvironmentVariables(typeof(StartupHook));
28+
29+
Log($"Connecting to hot-reload server");
2630

27-
_ = Task.Run(async () =>
31+
// Connect to the pipe synchronously.
32+
//
33+
// If a debugger is attached and there is a breakpoint in the startup code connecting asynchronously would
34+
// set up a race between this code connecting to the server, and the breakpoint being hit. If the breakpoint
35+
// hits first, applying changes will throw an error that the client is not connected.
36+
//
37+
// Updates made before the process is launched need to be applied before loading the affected modules.
38+
39+
var pipeClient = new NamedPipeClientStream(".", s_namedPipeName, PipeDirection.InOut, PipeOptions.CurrentUserOnly | PipeOptions.Asynchronous);
40+
try
41+
{
42+
pipeClient.Connect(ConnectionTimeoutMS);
43+
Log("Connected.");
44+
}
45+
catch (TimeoutException)
2846
{
29-
Log($"Connecting to hot-reload server");
47+
Log($"Failed to connect in {ConnectionTimeoutMS}ms.");
48+
return;
49+
}
3050

31-
const int TimeOutMS = 5000;
51+
var agent = new HotReloadAgent();
52+
try
53+
{
54+
// block until initialization completes:
55+
InitializeAsync(pipeClient, agent, CancellationToken.None).GetAwaiter().GetResult();
3256

33-
using var pipeClient = new NamedPipeClientStream(".", s_namedPipeName, PipeDirection.InOut, PipeOptions.CurrentUserOnly | PipeOptions.Asynchronous);
34-
try
35-
{
36-
await pipeClient.ConnectAsync(TimeOutMS);
37-
Log("Connected.");
38-
}
39-
catch (TimeoutException)
40-
{
41-
Log($"Failed to connect in {TimeOutMS}ms.");
42-
return;
43-
}
57+
// fire and forget:
58+
_ = ReceiveAndApplyUpdatesAsync(pipeClient, agent, initialUpdates: false, CancellationToken.None);
59+
}
60+
catch (Exception ex)
61+
{
62+
Log(ex.Message);
63+
pipeClient.Dispose();
64+
}
65+
}
4466

45-
using var agent = new HotReloadAgent();
46-
try
47-
{
48-
agent.Reporter.Report("Writing capabilities: " + agent.Capabilities, AgentMessageSeverity.Verbose);
67+
private static async ValueTask InitializeAsync(NamedPipeClientStream pipeClient, HotReloadAgent agent, CancellationToken cancellationToken)
68+
{
69+
agent.Reporter.Report("Writing capabilities: " + agent.Capabilities, AgentMessageSeverity.Verbose);
4970

50-
var initPayload = new ClientInitializationRequest(agent.Capabilities);
51-
await initPayload.WriteAsync(pipeClient, CancellationToken.None);
71+
var initPayload = new ClientInitializationResponse(agent.Capabilities);
72+
await initPayload.WriteAsync(pipeClient, cancellationToken);
73+
74+
// Apply updates made before this process was launched to avoid executing unupdated versions of the affected modules.
75+
await ReceiveAndApplyUpdatesAsync(pipeClient, agent, initialUpdates: true, cancellationToken);
76+
}
5277

53-
while (pipeClient.IsConnected)
78+
private static async Task ReceiveAndApplyUpdatesAsync(NamedPipeClientStream pipeClient, HotReloadAgent agent, bool initialUpdates, CancellationToken cancellationToken)
79+
{
80+
try
81+
{
82+
while (pipeClient.IsConnected)
83+
{
84+
var payloadType = (RequestType)await pipeClient.ReadByteAsync(cancellationToken);
85+
switch (payloadType)
5486
{
55-
var update = await ManagedCodeUpdateRequest.ReadAsync(pipeClient, CancellationToken.None);
56-
Log($"ResponseLoggingLevel = {update.ResponseLoggingLevel}");
57-
58-
bool success;
59-
try
60-
{
61-
agent.ApplyDeltas(update.Deltas);
62-
success = true;
63-
}
64-
catch (Exception e)
65-
{
66-
agent.Reporter.Report($"The runtime failed to applying the change: {e.Message}", AgentMessageSeverity.Error);
67-
agent.Reporter.Report("Further changes won't be applied to this process.", AgentMessageSeverity.Warning);
68-
success = false;
69-
}
70-
71-
var logEntries = agent.GetAndClearLogEntries(update.ResponseLoggingLevel);
72-
73-
var response = new UpdateResponse(logEntries, success);
74-
await response.WriteAsync(pipeClient, CancellationToken.None);
87+
case RequestType.ManagedCodeUpdate:
88+
// Shouldn't get initial managed code updates when the debugger is attached.
89+
// The debugger itself applies these updates when launching process with the debugger attached.
90+
Debug.Assert(!Debugger.IsAttached);
91+
await ReadAndApplyManagedCodeUpdateAsync(pipeClient, agent, cancellationToken);
92+
break;
93+
94+
case RequestType.StaticAssetUpdate:
95+
await ReadAndApplyStaticAssetUpdateAsync(pipeClient, agent, cancellationToken);
96+
break;
97+
98+
case RequestType.InitialUpdatesCompleted when initialUpdates:
99+
return;
100+
101+
default:
102+
// can't continue, the pipe content is in an unknown state
103+
Log($"Unexpected payload type: {payloadType}. Terminating agent.");
104+
return;
75105
}
76106
}
77-
catch (Exception e)
107+
}
108+
catch (Exception ex)
109+
{
110+
Log(ex.Message);
111+
}
112+
finally
113+
{
114+
if (!pipeClient.IsConnected)
115+
{
116+
await pipeClient.DisposeAsync();
117+
}
118+
119+
if (!initialUpdates)
78120
{
79-
Log(e.ToString());
121+
agent.Dispose();
80122
}
123+
}
124+
}
125+
126+
private static async ValueTask ReadAndApplyManagedCodeUpdateAsync(
127+
NamedPipeClientStream pipeClient,
128+
HotReloadAgent agent,
129+
CancellationToken cancellationToken)
130+
{
131+
var request = await ManagedCodeUpdateRequest.ReadAsync(pipeClient, cancellationToken);
81132

82-
Log("Stopped received delta updates. Server is no longer connected.");
83-
});
133+
bool success;
134+
try
135+
{
136+
agent.ApplyDeltas(request.Deltas);
137+
success = true;
138+
}
139+
catch (Exception e)
140+
{
141+
agent.Reporter.Report($"The runtime failed to applying the change: {e.Message}", AgentMessageSeverity.Error);
142+
agent.Reporter.Report("Further changes won't be applied to this process.", AgentMessageSeverity.Warning);
143+
success = false;
144+
}
145+
146+
var logEntries = agent.GetAndClearLogEntries(request.ResponseLoggingLevel);
147+
148+
var response = new UpdateResponse(logEntries, success);
149+
await response.WriteAsync(pipeClient, cancellationToken);
150+
}
151+
152+
private static async ValueTask ReadAndApplyStaticAssetUpdateAsync(
153+
NamedPipeClientStream pipeClient,
154+
HotReloadAgent agent,
155+
CancellationToken cancellationToken)
156+
{
157+
var request = await StaticAssetUpdateRequest.ReadAsync(pipeClient, cancellationToken);
158+
159+
agent.ApplyStaticAssetUpdate(new StaticAssetUpdate(request.AssemblyName, request.RelativePath, request.Contents, request.IsApplicationProject));
160+
161+
var logEntries = agent.GetAndClearLogEntries(request.ResponseLoggingLevel);
162+
163+
// Updating static asset only invokes ContentUpdate metadata update handlers.
164+
// Failures of these handlers are reported to the log and ignored.
165+
// Therefore, this request always succeeds.
166+
var response = new UpdateResponse(logEntries, success: true);
167+
168+
await response.WriteAsync(pipeClient, cancellationToken);
84169
}
85170

86171
public static bool IsMatchingProcess(string processPath, string targetProcessPath)
@@ -101,32 +186,6 @@ public static bool IsMatchingProcess(string processPath, string targetProcessPat
101186
string.Equals(processPath[..^4], targetProcessPath[..^4], comparison);
102187
}
103188

104-
internal static void ClearHotReloadEnvironmentVariables()
105-
{
106-
// Clear any hot-reload specific environment variables. This prevents child processes from being
107-
// affected by the current app's hot reload settings. See https://github.com/dotnet/runtime/issues/58000
108-
109-
Environment.SetEnvironmentVariable(EnvironmentVariables.Names.DotnetStartupHooks,
110-
RemoveCurrentAssembly(Environment.GetEnvironmentVariable(EnvironmentVariables.Names.DotnetStartupHooks)));
111-
112-
Environment.SetEnvironmentVariable(EnvironmentVariables.Names.DotnetWatchHotReloadNamedPipeName, "");
113-
Environment.SetEnvironmentVariable(EnvironmentVariables.Names.HotReloadDeltaClientLogMessages, "");
114-
}
115-
116-
internal static string RemoveCurrentAssembly(string environment)
117-
{
118-
if (environment is "")
119-
{
120-
return environment;
121-
}
122-
123-
var assemblyLocation = typeof(StartupHook).Assembly.Location;
124-
var updatedValues = environment.Split(Path.PathSeparator, StringSplitOptions.RemoveEmptyEntries)
125-
.Where(e => !string.Equals(e, assemblyLocation, StringComparison.OrdinalIgnoreCase));
126-
127-
return string.Join(Path.PathSeparator, updatedValues);
128-
}
129-
130189
private static void Log(string message)
131190
{
132191
if (s_logToStandardOutput)

0 commit comments

Comments
 (0)