From faa78a3d91f64770444a05841d20774db4b4f64e Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 21 Oct 2015 10:05:41 -0700 Subject: [PATCH] Transition from `IAssemblyLoadContext` to `AssemblyLoadContext`. - `IAssemblyLoadContext` is a DNX defined type that will eventually go away. #3365 --- .../Compilation/RoslynCompilationService.cs | 42 ++++++++++++++++--- src/Microsoft.AspNet.Mvc.Razor/project.json | 3 +- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Mvc.Razor/Compilation/RoslynCompilationService.cs b/src/Microsoft.AspNet.Mvc.Razor/Compilation/RoslynCompilationService.cs index 3efbedd709..2d65fb801e 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/Compilation/RoslynCompilationService.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/Compilation/RoslynCompilationService.cs @@ -9,6 +9,9 @@ using System.IO; using System.Linq; using System.Reflection; using System.Reflection.PortableExecutable; +#if DOTNET5_4 +using System.Runtime.Loader; +#endif using Microsoft.AspNet.FileProviders; using Microsoft.AspNet.Mvc.Razor.Internal; using Microsoft.CodeAnalysis; @@ -32,12 +35,15 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation private readonly ILibraryExporter _libraryExporter; private readonly IApplicationEnvironment _environment; - private readonly IAssemblyLoadContext _loader; private readonly ICompilerOptionsProvider _compilerOptionsProvider; private readonly IFileProvider _fileProvider; private readonly Lazy> _applicationReferences; private readonly string _classPrefix; +#if DOTNET5_4 + private readonly RazorLoadContext _razorLoadContext; +#endif + /// /// Initalizes a new instance of the class. /// @@ -52,19 +58,21 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation /// The that was used to generate the code. public RoslynCompilationService( IApplicationEnvironment environment, - IAssemblyLoadContextAccessor loaderAccessor, ILibraryExporter libraryExporter, ICompilerOptionsProvider compilerOptionsProvider, IMvcRazorHost host, IOptions optionsAccessor) { _environment = environment; - _loader = loaderAccessor.GetLoadContext(typeof(RoslynCompilationService).GetTypeInfo().Assembly); _libraryExporter = libraryExporter; _applicationReferences = new Lazy>(GetApplicationReferences); _compilerOptionsProvider = compilerOptionsProvider; _fileProvider = optionsAccessor.Value.FileProvider; _classPrefix = host.MainClassNamePrefix; + +#if DOTNET5_4 + _razorLoadContext = new RazorLoadContext(); +#endif } /// @@ -131,11 +139,11 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation if (_supportsPdbGeneration.Value) { pdb.Seek(0, SeekOrigin.Begin); - assembly = _loader.LoadStream(ms, pdb); + assembly = LoadStream(ms, pdb); } else { - assembly = _loader.LoadStream(ms, assemblySymbols: null); + assembly = LoadStream(ms, assemblySymbols: null); } var type = assembly.GetExportedTypes() @@ -146,6 +154,15 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation } } + private Assembly LoadStream(MemoryStream ms, MemoryStream assemblySymbols) + { +#if NET451 + return Assembly.Load(ms.ToArray(), assemblySymbols?.ToArray()); +#else + return _razorLoadContext.Load(ms, assemblySymbols); +#endif + } + private CSharpCompilation Rewrite(CSharpCompilation compilation) { var rewrittenTrees = new List(); @@ -321,5 +338,20 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation return null; } + +#if DOTNET5_4 + private class RazorLoadContext : AssemblyLoadContext + { + protected override Assembly Load(AssemblyName assemblyName) + { + return Default.LoadFromAssemblyName(assemblyName); + } + + public Assembly Load(Stream assembly, Stream assemblySymbols) + { + return LoadFromStream(assembly, assemblySymbols); + } + } +#endif } } diff --git a/src/Microsoft.AspNet.Mvc.Razor/project.json b/src/Microsoft.AspNet.Mvc.Razor/project.json index a070fd055f..f378ece0bc 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/project.json +++ b/src/Microsoft.AspNet.Mvc.Razor/project.json @@ -41,6 +41,7 @@ "dotnet5.4": { "dependencies": { "System.Text.Encoding": "4.0.11-*", + "System.Runtime.Loader": "4.0.0-*", "System.Threading.Tasks.Parallel": "4.0.1-beta-*" } } @@ -50,4 +51,4 @@ "node_modules", "bower_components" ] -} \ No newline at end of file +}