diff --git a/src/Microsoft.DotNet.ProjectModel.Loader/LoaderProjectContextExtensions.cs b/src/Microsoft.DotNet.ProjectModel.Loader/LoaderProjectContextExtensions.cs new file mode 100644 index 000000000..5ec178400 --- /dev/null +++ b/src/Microsoft.DotNet.ProjectModel.Loader/LoaderProjectContextExtensions.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.Loader; +using Microsoft.Extensions.ProjectModel; + +namespace Microsoft.DotNet.ProjectModel.Loader +{ + public static class LoaderProjectContextExtensions + { + public static AssemblyLoadContext Create(this ProjectContext context, string configuration = "Debug") + { + var exporter = context.CreateExporter(configuration); + var assemblies = new Dictionary(); + var dllImports = new Dictionary(); + + foreach (var export in exporter.GetAllExports()) + { + // TODO: Handle project references + // TODO: Handle resource assemblies + foreach (var asset in export.RuntimeAssemblies) + { + // REVIEW: Should we use the following? + // AssemblyLoadContext.GetAssemblyName(asset.ResolvedPath); + var assemblyName = new AssemblyName(asset.Name); + assemblies[assemblyName] = asset.ResolvedPath; + } + + foreach (var asset in export.NativeLibraries) + { + dllImports[asset.Name] = asset.ResolvedPath; + } + } + + return new ProjectContextLoadContext(assemblies, dllImports); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.DotNet.ProjectModel.Loader/ProjectContextLoadContext.cs b/src/Microsoft.DotNet.ProjectModel.Loader/ProjectContextLoadContext.cs new file mode 100644 index 000000000..24e9914ab --- /dev/null +++ b/src/Microsoft.DotNet.ProjectModel.Loader/ProjectContextLoadContext.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.Loader; + +namespace Microsoft.DotNet.ProjectModel.Loader +{ + public class ProjectContextLoadContext : AssemblyLoadContext + { + private readonly Dictionary _assemblies; + private readonly Dictionary _dllImports; + public ProjectContextLoadContext(Dictionary assemblies, + Dictionary dllImports) + { + _assemblies = assemblies; + _dllImports = dllImports; + } + + protected override Assembly Load(AssemblyName assemblyName) + { + string path; + if (_assemblies.TryGetValue(assemblyName, out path)) + { + return LoadFromAssemblyPath(path); + } + + return null; + } + + protected override IntPtr LoadUnmanagedDll(string unmanagedDllName) + { + string path; + if (_dllImports.TryGetValue(unmanagedDllName, out path)) + { + return LoadUnmanagedDllFromPath(path); + } + + return base.LoadUnmanagedDll(unmanagedDllName); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.DotNet.ProjectModel.Loader/project.json b/src/Microsoft.DotNet.ProjectModel.Loader/project.json new file mode 100644 index 000000000..b8227c95f --- /dev/null +++ b/src/Microsoft.DotNet.ProjectModel.Loader/project.json @@ -0,0 +1,9 @@ +{ + "dependencies": { + "Microsoft.DotNet.ProjectModel": "1.0.0-*", + "System.Runtime.Loader": "4.0.0-beta-23504" + }, + "frameworks": { + "dnxcore50": { } + } +} \ No newline at end of file diff --git a/src/Microsoft.DotNet.ProjectModel.Workspaces/ProjectJsonWorkspace.cs b/src/Microsoft.DotNet.ProjectModel.Workspaces/ProjectJsonWorkspace.cs index b52958fc8..e779097f2 100644 --- a/src/Microsoft.DotNet.ProjectModel.Workspaces/ProjectJsonWorkspace.cs +++ b/src/Microsoft.DotNet.ProjectModel.Workspaces/ProjectJsonWorkspace.cs @@ -21,22 +21,23 @@ namespace Microsoft.DotNet.ProjectModel.Workspaces { private Dictionary _cache = new Dictionary(); - private readonly string[] _projectPaths; + public ProjectJsonWorkspace(ProjectContext context) : base(MefHostServices.DefaultHost, "Custom") + { + AddProject(context); + } public ProjectJsonWorkspace(string projectPath) : this(new[] { projectPath }) { } - public ProjectJsonWorkspace(string[] projectPaths) : base(MefHostServices.DefaultHost, "Custom") + public ProjectJsonWorkspace(IEnumerable projectPaths) : base(MefHostServices.DefaultHost, "Custom") { - _projectPaths = projectPaths; - - Initialize(); + Initialize(projectPaths); } - private void Initialize() + private void Initialize(IEnumerable projectPaths) { - foreach (var projectPath in _projectPaths) + foreach (var projectPath in projectPaths) { AddProject(projectPath); } diff --git a/src/Microsoft.DotNet.ProjectModel.Workspaces/WorkspaceProjectContextExtensions.cs b/src/Microsoft.DotNet.ProjectModel.Workspaces/WorkspaceProjectContextExtensions.cs new file mode 100644 index 000000000..6bba8b877 --- /dev/null +++ b/src/Microsoft.DotNet.ProjectModel.Workspaces/WorkspaceProjectContextExtensions.cs @@ -0,0 +1,13 @@ +using Microsoft.CodeAnalysis; +using Microsoft.Extensions.ProjectModel; + +namespace Microsoft.DotNet.ProjectModel.Workspaces +{ + public static class WorkspaceProjectContextExtensions + { + public static Workspace CreateWorkspace(this ProjectContext context) + { + return new ProjectJsonWorkspace(context); + } + } +} \ No newline at end of file