Fix DependencyContext splitting on semi-colon (#87518)
authorEric Erhardt <eric.erhardt@microsoft.com>
Wed, 14 Jun 2023 02:47:39 +0000 (20:47 -0600)
committerGitHub <noreply@github.com>
Wed, 14 Jun 2023 02:47:39 +0000 (21:47 -0500)
* Fix DependencyContext splitting on semi-colon

https://github.com/dotnet/runtime/commit/5e67657e20665c32c2bd5c4ac1c8b1af78c9677e introduced a bug in DependencyContextPaths where the static array is not initialized before it is being used in the Create static method.

This fix removes the static array since it is only used once.

- Don't cache the semicolon array since it is only used once at startup
- Skip test on netfx since it doesn't work.

src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextPaths.cs
src/libraries/Microsoft.Extensions.DependencyModel/tests/DependencyContextTests.cs

index 4d056a2..b5c6730 100644 (file)
@@ -20,8 +20,6 @@ namespace Microsoft.Extensions.DependencyModel
 
         public IEnumerable<string> NonApplicationPaths { get; }
 
-        private static readonly char[] s_semicolon = new[] { ';' };
-
         public DependencyContextPaths(
             string? application,
             string? sharedRuntime,
@@ -42,7 +40,13 @@ namespace Microsoft.Extensions.DependencyModel
 
         internal static DependencyContextPaths Create(string? depsFiles, string? sharedRuntime)
         {
-            string[]? files = depsFiles?.Split(s_semicolon, StringSplitOptions.RemoveEmptyEntries);
+#if NETCOREAPP
+            const char separator = ';';
+#else
+            // This method is only executed once at startup. No need to cache the char[].
+            char[] separator = { ';' };
+#endif
+            string[]? files = depsFiles?.Split(separator, StringSplitOptions.RemoveEmptyEntries);
             string? application = files != null && files.Length > 0 ? files[0] : null;
 
             string[]? nonApplicationPaths = files?
index 0c570d6..f657aea 100644 (file)
@@ -276,6 +276,19 @@ namespace Microsoft.Extensions.DependencyModel.Tests
                 Subject.Fallbacks.Should().BeEquivalentTo("win7-x64", "win7-x86");
         }
 
+        [Fact]
+        [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "GetEntryAssembly() returns null")]
+        public void DefaultWorksCorrectly()
+        {
+            // only need to assert the context contains non-null properties.
+
+            var context = DependencyContext.Default;
+            Assert.NotNull(context);
+            Assert.NotNull(context.RuntimeGraph);
+            Assert.NotNull(context.RuntimeLibraries);
+            Assert.NotNull(context.Target);
+        }
+
         private TargetInfo CreateTargetInfo()
         {
             return new TargetInfo(