diff --git a/src/Microsoft.DotNet.ProjectModel/DependencyContextBuilder.cs b/src/Microsoft.DotNet.ProjectModel/DependencyContextBuilder.cs index 8b088e88c..fcfec2cc4 100644 --- a/src/Microsoft.DotNet.ProjectModel/DependencyContextBuilder.cs +++ b/src/Microsoft.DotNet.ProjectModel/DependencyContextBuilder.cs @@ -129,6 +129,7 @@ namespace Microsoft.Extensions.DependencyModel export.Library.Identity.Version.ToString(), export.Library.Hash, assemblies.Select(RuntimeAssembly.Create), + export.NativeLibraries.Select(l => l.RelativePath), export.ResourceAssemblies.Select(CreateResourceAssembly), export.RuntimeTargets.Select(CreateRuntimeTarget), libraryDependencies, diff --git a/src/Microsoft.Extensions.DependencyModel/DependencyContextCsvReader.cs b/src/Microsoft.Extensions.DependencyModel/DependencyContextCsvReader.cs index 69c4b2bf2..ebab91f2e 100644 --- a/src/Microsoft.Extensions.DependencyModel/DependencyContextCsvReader.cs +++ b/src/Microsoft.Extensions.DependencyModel/DependencyContextCsvReader.cs @@ -47,6 +47,7 @@ namespace Microsoft.Extensions.DependencyModel version: identity.Item3, hash: identity.Item4, assemblies: packageGroup.Select(l => RuntimeAssembly.Create(l.AssetPath)), + nativeLibraries: Enumerable.Empty(), resourceAssemblies: Enumerable.Empty(), subTargets: Enumerable.Empty(), dependencies: Enumerable.Empty(), diff --git a/src/Microsoft.Extensions.DependencyModel/DependencyContextJsonReader.cs b/src/Microsoft.Extensions.DependencyModel/DependencyContextJsonReader.cs index 3dc15822f..ca0d90916 100644 --- a/src/Microsoft.Extensions.DependencyModel/DependencyContextJsonReader.cs +++ b/src/Microsoft.Extensions.DependencyModel/DependencyContextJsonReader.cs @@ -169,10 +169,12 @@ namespace Microsoft.Extensions.DependencyModel )); } - var assemblies = ReadAssemblies(libraryObject, DependencyContextStrings.RuntimeAssembliesKey) + var assemblies = ReadAssetList(libraryObject, DependencyContextStrings.RuntimeAssembliesKey) .Select(RuntimeAssembly.Create) .ToArray(); + var nativeLibraries = ReadAssetList(libraryObject, DependencyContextStrings.NativeLibrariesKey); + var resourceAssemblies = ReadResourceAssemblies((JObject)libraryObject[DependencyContextStrings.ResourceAssembliesPropertyName]); return new RuntimeLibrary( @@ -181,6 +183,7 @@ namespace Microsoft.Extensions.DependencyModel version: version, hash: stub.Hash, assemblies: assemblies, + nativeLibraries: nativeLibraries, resourceAssemblies: resourceAssemblies, subTargets: runtimeTargets.ToArray(), dependencies: dependencies, @@ -188,7 +191,7 @@ namespace Microsoft.Extensions.DependencyModel } else { - var assemblies = ReadAssemblies(libraryObject, DependencyContextStrings.CompileTimeAssembliesKey); + var assemblies = ReadAssetList(libraryObject, DependencyContextStrings.CompileTimeAssembliesKey); return new CompilationLibrary(stub.Type, name, version, stub.Hash, assemblies, dependencies, stub.Serviceable); } } @@ -226,7 +229,7 @@ namespace Microsoft.Extensions.DependencyModel } } - private static string[] ReadAssemblies(JObject libraryObject, string name) + private static string[] ReadAssetList(JObject libraryObject, string name) { var assembliesObject = (JObject) libraryObject[name]; diff --git a/src/Microsoft.Extensions.DependencyModel/DependencyContextStrings.cs b/src/Microsoft.Extensions.DependencyModel/DependencyContextStrings.cs index 7f098877e..b5df3f7a3 100644 --- a/src/Microsoft.Extensions.DependencyModel/DependencyContextStrings.cs +++ b/src/Microsoft.Extensions.DependencyModel/DependencyContextStrings.cs @@ -11,6 +11,8 @@ namespace Microsoft.Extensions.DependencyModel internal const string RuntimeAssembliesKey = "runtime"; + internal const string NativeLibrariesKey = "native"; + internal const string RuntimeTargetPropertyName = "runtimeTarget"; internal const string LibrariesPropertyName = "libraries"; diff --git a/src/Microsoft.Extensions.DependencyModel/DependencyContextWriter.cs b/src/Microsoft.Extensions.DependencyModel/DependencyContextWriter.cs index 2f26e8c49..1a6235345 100644 --- a/src/Microsoft.Extensions.DependencyModel/DependencyContextWriter.cs +++ b/src/Microsoft.Extensions.DependencyModel/DependencyContextWriter.cs @@ -147,7 +147,7 @@ namespace Microsoft.Extensions.DependencyModel return; } libraryObject.Add(new JProperty(DependencyContextStrings.CompileTimeAssembliesKey, - WriteAssemblies(compilationAssemblies)) + WriteAssetList(compilationAssemblies)) ); } @@ -158,7 +158,7 @@ namespace Microsoft.Extensions.DependencyModel return; } libraryObject.Add(new JProperty(DependencyContextStrings.RuntimeAssembliesKey, - WriteAssemblies(runtimeAssemblies.Select(a => a.Path))) + WriteAssetList(runtimeAssemblies.Select(a => a.Path))) ); } @@ -197,6 +197,12 @@ namespace Microsoft.Extensions.DependencyModel AddDependencies(libraryObject, runtimeLibrary.Dependencies); AddRuntimeAssemblies(libraryObject, runtimeLibrary.Assemblies); AddResourceAssemblies(libraryObject, runtimeLibrary.ResourceAssemblies); + + if (runtimeLibrary.NativeLibraries.Any()) + { + libraryObject.Add(DependencyContextStrings.NativeLibrariesKey, WriteAssetList(runtimeLibrary.NativeLibraries)); + } + return libraryObject; } @@ -213,7 +219,6 @@ namespace Microsoft.Extensions.DependencyModel private JObject WritePortableTargetLibrary(RuntimeLibrary runtimeLibrary, CompilationLibrary compilationLibrary) { - var libraryObject = new JObject(); var dependencies = new HashSet(); @@ -229,6 +234,7 @@ namespace Microsoft.Extensions.DependencyModel } AddResourceAssemblies(libraryObject, runtimeLibrary.ResourceAssemblies); AddRuntimeAssemblies(libraryObject, runtimeLibrary.Assemblies); + libraryObject.Add(DependencyContextStrings.NativeLibrariesKey, WriteAssetList(runtimeLibrary.NativeLibraries)); dependencies.UnionWith(runtimeLibrary.Dependencies); } @@ -272,9 +278,9 @@ namespace Microsoft.Extensions.DependencyModel } } - private JObject WriteAssemblies(IEnumerable assemblies) + private JObject WriteAssetList(IEnumerable assetPaths) { - return new JObject(assemblies.Select(assembly => new JProperty(NormalizePath(assembly), new JObject()))); + return new JObject(assetPaths.Select(assembly => new JProperty(NormalizePath(assembly), new JObject()))); } private JObject WriteLibraries(DependencyContext context) diff --git a/src/Microsoft.Extensions.DependencyModel/RuntimeLibrary.cs b/src/Microsoft.Extensions.DependencyModel/RuntimeLibrary.cs index a3ee2332f..c7858de26 100644 --- a/src/Microsoft.Extensions.DependencyModel/RuntimeLibrary.cs +++ b/src/Microsoft.Extensions.DependencyModel/RuntimeLibrary.cs @@ -14,6 +14,7 @@ namespace Microsoft.Extensions.DependencyModel string version, string hash, IEnumerable assemblies, + IEnumerable nativeLibraries, IEnumerable resourceAssemblies, IEnumerable subTargets, IEnumerable dependencies, @@ -23,9 +24,12 @@ namespace Microsoft.Extensions.DependencyModel Assemblies = assemblies.ToArray(); ResourceAssemblies = resourceAssemblies.ToArray(); RuntimeTargets = subTargets.ToArray(); + NativeLibraries = nativeLibraries.ToArray(); } public IReadOnlyList Assemblies { get; } + + public IReadOnlyList NativeLibraries { get; } public IReadOnlyList ResourceAssemblies { get; } diff --git a/test/Microsoft.Extensions.DependencyModel.Tests/DependencyContextJsonWriterTests.cs b/test/Microsoft.Extensions.DependencyModel.Tests/DependencyContextJsonWriterTests.cs index cafc90bf2..2091b157b 100644 --- a/test/Microsoft.Extensions.DependencyModel.Tests/DependencyContextJsonWriterTests.cs +++ b/test/Microsoft.Extensions.DependencyModel.Tests/DependencyContextJsonWriterTests.cs @@ -151,6 +151,7 @@ namespace Microsoft.Extensions.DependencyModel.Tests "1.2.3", "HASH", new [] { RuntimeAssembly.Create("Banana.dll")}, + new [] { "runtimes\\linux\\native\\native.so" }, new [] { new ResourceAssembly("en-US\\Banana.Resource.dll", "en-US")}, new [] { @@ -172,8 +173,11 @@ namespace Microsoft.Extensions.DependencyModel.Tests var library = target.Should().HavePropertyAsObject("PackageName/1.2.3").Subject; var dependencies = library.Should().HavePropertyAsObject("dependencies").Subject; dependencies.Should().HavePropertyValue("Fruits.Abstract.dll", "2.0.0"); + library.Should().HavePropertyAsObject("runtime") .Subject.Should().HaveProperty("Banana.dll"); + library.Should().HavePropertyAsObject("native") + .Subject.Should().HaveProperty("runtimes/linux/native/native.so"); var runtimeTargets = library.Should().HavePropertyAsObject("runtimeTargets").Subject; @@ -226,6 +230,7 @@ namespace Microsoft.Extensions.DependencyModel.Tests "1.2.3", "HASH", new [] { RuntimeAssembly.Create("Banana.dll")}, + new [] { "native.dll" }, new ResourceAssembly[] {}, new [] { @@ -247,8 +252,11 @@ namespace Microsoft.Extensions.DependencyModel.Tests var library = target.Should().HavePropertyAsObject("PackageName/1.2.3").Subject; var dependencies = library.Should().HavePropertyAsObject("dependencies").Subject; dependencies.Should().HavePropertyValue("Fruits.Abstract.dll", "2.0.0"); + library.Should().HavePropertyAsObject("runtime") .Subject.Should().HaveProperty("Banana.dll"); + library.Should().HavePropertyAsObject("native") + .Subject.Should().HaveProperty("native.dll"); library.Should().HavePropertyAsObject("compile") .Subject.Should().HaveProperty("ref/Banana.dll"); @@ -286,6 +294,7 @@ namespace Microsoft.Extensions.DependencyModel.Tests "1.2.3", "HASH", new [] { RuntimeAssembly.Create("Banana.dll")}, + new [] { "runtimes\\osx\\native\\native.dylib" }, new ResourceAssembly[] {}, new RuntimeTarget[] {}, new [] { @@ -303,6 +312,8 @@ namespace Microsoft.Extensions.DependencyModel.Tests dependencies.Should().HavePropertyValue("Fruits.Abstract.dll", "2.0.0"); library.Should().HavePropertyAsObject("runtime") .Subject.Should().HaveProperty("Banana.dll"); + library.Should().HavePropertyAsObject("native") + .Subject.Should().HaveProperty("runtimes/osx/native/native.dylib"); //libraries var libraries = result.Should().HavePropertyAsObject("libraries").Subject; @@ -327,6 +338,7 @@ namespace Microsoft.Extensions.DependencyModel.Tests "1.2.3", "HASH", new RuntimeAssembly[] { }, + new string[] { }, new [] { new ResourceAssembly("en-US/Fruits.resources.dll", "en-US") @@ -361,6 +373,7 @@ namespace Microsoft.Extensions.DependencyModel.Tests "1.2.3", "HASH", new RuntimeAssembly[] { }, + new string[] { }, new [] { new ResourceAssembly("en-US/Fruits.resources.dll", "en-US")