Skip to content
This repository was archived by the owner on Dec 14, 2018. It is now read-only.

Commit 71ea31c

Browse files
committed
Adding support for Razor precompilation
Fixes #3917
1 parent b7a0393 commit 71ea31c

21 files changed

+507
-208
lines changed

Mvc.NoFun.sln

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Microsoft Visual Studio Solution File, Format Version 12.00
22
# Visual Studio 14
3-
VisualStudioVersion = 14.0.24720.0
3+
VisualStudioVersion = 14.0.25420.1
44
MinimumVisualStudioVersion = 10.0.40219.1
55
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{DAAE4C74-D06F-4874-A166-33305D2643CE}"
66
EndProject
@@ -16,8 +16,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Mvc.Co
1616
EndProject
1717
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Mvc.Razor.Test", "test\Microsoft.AspNetCore.Mvc.Razor.Test\Microsoft.AspNetCore.Mvc.Razor.Test.xproj", "{3F6E355E-4869-41D9-943B-D54771221A7F}"
1818
EndProject
19-
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Mvc.Core.Test", "test\Microsoft.AspNetCore.Mvc.Core.Test\Microsoft.AspNetCore.Mvc.Core.Test.xproj", "{A8AA326E-8EE8-4F11-B750-23028E0949D7}"
20-
EndProject
2119
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Mvc.Razor.Host", "src\Microsoft.AspNetCore.Mvc.Razor.Host\Microsoft.AspNetCore.Mvc.Razor.Host.xproj", "{520B3AA4-363A-497C-8C15-80423C5AFC85}"
2220
EndProject
2321
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Mvc.Razor.Host.Test", "test\Microsoft.AspNetCore.Mvc.Razor.Host.Test\Microsoft.AspNetCore.Mvc.Razor.Host.Test.xproj", "{7C4F5973-0491-4028-B1DC-A9BA73FF9F77}"
@@ -69,8 +67,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Mvc.Co
6967
EndProject
7068
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Mvc.DataAnnotations", "src\Microsoft.AspNetCore.Mvc.DataAnnotations\Microsoft.AspNetCore.Mvc.DataAnnotations.xproj", "{2DD786CA-7AF7-437A-B499-801A589B9A1C}"
7169
EndProject
72-
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Mvc.Cors.Test", "test\Microsoft.AspNetCore.Mvc.Cors.Test\Microsoft.AspNetCore.Mvc.Cors.Test.xproj", "{6BB4C20B-24C0-45D6-9E4C-C2620959BDD5}"
73-
EndProject
7470
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Mvc.DataAnnotations.Test", "test\Microsoft.AspNetCore.Mvc.DataAnnotations.Test\Microsoft.AspNetCore.Mvc.DataAnnotations.Test.xproj", "{827DBBCB-F3A9-4BAD-8262-4BD43E28EB3B}"
7571
EndProject
7672
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Mvc.Localization", "src\Microsoft.AspNetCore.Mvc.Localization\Microsoft.AspNetCore.Mvc.Localization.xproj", "{50893B10-5735-4F35-9995-F81DA3F0189E}"
@@ -131,16 +127,6 @@ Global
131127
{3F6E355E-4869-41D9-943B-D54771221A7F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
132128
{3F6E355E-4869-41D9-943B-D54771221A7F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
133129
{3F6E355E-4869-41D9-943B-D54771221A7F}.Release|x86.ActiveCfg = Release|Any CPU
134-
{A8AA326E-8EE8-4F11-B750-23028E0949D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
135-
{A8AA326E-8EE8-4F11-B750-23028E0949D7}.Debug|Any CPU.Build.0 = Debug|Any CPU
136-
{A8AA326E-8EE8-4F11-B750-23028E0949D7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
137-
{A8AA326E-8EE8-4F11-B750-23028E0949D7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
138-
{A8AA326E-8EE8-4F11-B750-23028E0949D7}.Debug|x86.ActiveCfg = Debug|Any CPU
139-
{A8AA326E-8EE8-4F11-B750-23028E0949D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
140-
{A8AA326E-8EE8-4F11-B750-23028E0949D7}.Release|Any CPU.Build.0 = Release|Any CPU
141-
{A8AA326E-8EE8-4F11-B750-23028E0949D7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
142-
{A8AA326E-8EE8-4F11-B750-23028E0949D7}.Release|Mixed Platforms.Build.0 = Release|Any CPU
143-
{A8AA326E-8EE8-4F11-B750-23028E0949D7}.Release|x86.ActiveCfg = Release|Any CPU
144130
{520B3AA4-363A-497C-8C15-80423C5AFC85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
145131
{520B3AA4-363A-497C-8C15-80423C5AFC85}.Debug|Any CPU.Build.0 = Debug|Any CPU
146132
{520B3AA4-363A-497C-8C15-80423C5AFC85}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -393,18 +379,6 @@ Global
393379
{2DD786CA-7AF7-437A-B499-801A589B9A1C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
394380
{2DD786CA-7AF7-437A-B499-801A589B9A1C}.Release|x86.ActiveCfg = Release|Any CPU
395381
{2DD786CA-7AF7-437A-B499-801A589B9A1C}.Release|x86.Build.0 = Release|Any CPU
396-
{6BB4C20B-24C0-45D6-9E4C-C2620959BDD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
397-
{6BB4C20B-24C0-45D6-9E4C-C2620959BDD5}.Debug|Any CPU.Build.0 = Debug|Any CPU
398-
{6BB4C20B-24C0-45D6-9E4C-C2620959BDD5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
399-
{6BB4C20B-24C0-45D6-9E4C-C2620959BDD5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
400-
{6BB4C20B-24C0-45D6-9E4C-C2620959BDD5}.Debug|x86.ActiveCfg = Debug|Any CPU
401-
{6BB4C20B-24C0-45D6-9E4C-C2620959BDD5}.Debug|x86.Build.0 = Debug|Any CPU
402-
{6BB4C20B-24C0-45D6-9E4C-C2620959BDD5}.Release|Any CPU.ActiveCfg = Release|Any CPU
403-
{6BB4C20B-24C0-45D6-9E4C-C2620959BDD5}.Release|Any CPU.Build.0 = Release|Any CPU
404-
{6BB4C20B-24C0-45D6-9E4C-C2620959BDD5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
405-
{6BB4C20B-24C0-45D6-9E4C-C2620959BDD5}.Release|Mixed Platforms.Build.0 = Release|Any CPU
406-
{6BB4C20B-24C0-45D6-9E4C-C2620959BDD5}.Release|x86.ActiveCfg = Release|Any CPU
407-
{6BB4C20B-24C0-45D6-9E4C-C2620959BDD5}.Release|x86.Build.0 = Release|Any CPU
408382
{827DBBCB-F3A9-4BAD-8262-4BD43E28EB3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
409383
{827DBBCB-F3A9-4BAD-8262-4BD43E28EB3B}.Debug|Any CPU.Build.0 = Debug|Any CPU
410384
{827DBBCB-F3A9-4BAD-8262-4BD43E28EB3B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -473,7 +447,6 @@ Global
473447
{314E9AD6-2FFC-4A92-A8AD-510658C64F1E} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
474448
{C48DA9D7-ACB5-4408-AA79-27ECB60A67EF} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
475449
{3F6E355E-4869-41D9-943B-D54771221A7F} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
476-
{A8AA326E-8EE8-4F11-B750-23028E0949D7} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
477450
{520B3AA4-363A-497C-8C15-80423C5AFC85} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
478451
{7C4F5973-0491-4028-B1DC-A9BA73FF9F77} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
479452
{5F945B82-FE5F-425C-956C-8BC2F2020254} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
@@ -496,7 +469,6 @@ Global
496469
{22019146-BDFA-442E-8C8E-345FB9644578} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
497470
{9A07EEA2-942E-4969-9D41-799B6E2D1FF5} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
498471
{2DD786CA-7AF7-437A-B499-801A589B9A1C} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
499-
{6BB4C20B-24C0-45D6-9E4C-C2620959BDD5} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
500472
{827DBBCB-F3A9-4BAD-8262-4BD43E28EB3B} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
501473
{50893B10-5735-4F35-9995-F81DA3F0189E} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
502474
{8FC726B5-E766-44E0-8B38-1313B6D8D9A7} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}

src/Microsoft.AspNetCore.Mvc.Core/ApplicationParts/AssemblyPart.cs

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,35 @@
55
using System.Collections.Generic;
66
using System.Linq;
77
using System.Reflection;
8+
using Microsoft.AspNetCore.Mvc.Core.ApplicationParts;
89
using Microsoft.Extensions.DependencyModel;
910

1011
namespace Microsoft.AspNetCore.Mvc.ApplicationParts
1112
{
1213
/// <summary>
1314
/// An <see cref="ApplicationPart"/> backed by an <see cref="Assembly"/>.
1415
/// </summary>
15-
public class AssemblyPart : ApplicationPart, IApplicationPartTypeProvider, ICompilationReferencesProvider
16+
public class AssemblyPart :
17+
ApplicationPart,
18+
IApplicationPartTypeProvider,
19+
ICompilationReferencesProvider,
20+
IViewsProvider
1621
{
22+
/// <summary>
23+
/// Gets the suffix for the view assembly.
24+
/// </summary>
25+
public static readonly string PrecompiledViewsAssemblySuffix = ".PrecompiledViews";
26+
27+
/// <summary>
28+
/// Gets the namespace for the <see cref="ViewInfoContainer"/> type in the view assembly.
29+
/// </summary>
30+
public static readonly string ViewInfoContainerNamespace = "AspNetCore";
31+
32+
/// <summary>
33+
/// Gets the type name for the view collection type in the view assembly.
34+
/// </summary>
35+
public static readonly string ViewInfoContainerTypeName = "__PrecompiledViewCollection";
36+
1737
/// <summary>
1838
/// Initalizes a new <see cref="AssemblyPart"/> instance.
1939
/// </summary>
@@ -41,6 +61,27 @@ public AssemblyPart(Assembly assembly)
4161
/// <inheritdoc />
4262
public IEnumerable<TypeInfo> Types => Assembly.DefinedTypes;
4363

64+
/// <inheritdoc />
65+
public IEnumerable<ViewInfo> Views
66+
{
67+
get
68+
{
69+
var precompiledAssemblyName = new AssemblyName(Assembly.FullName);
70+
precompiledAssemblyName.Name = precompiledAssemblyName.Name + PrecompiledViewsAssemblySuffix;
71+
72+
var typeName = $"{ViewInfoContainerNamespace}.{ViewInfoContainerTypeName},{precompiledAssemblyName}";
73+
var viewInfoContainerTypeName = Type.GetType(typeName);
74+
75+
if (viewInfoContainerTypeName == null)
76+
{
77+
return null;
78+
}
79+
80+
var precompiledViews = (ViewInfoContainer)Activator.CreateInstance(viewInfoContainerTypeName);
81+
return precompiledViews.ViewInfos;
82+
}
83+
}
84+
4485
/// <inheritdoc />
4586
public IEnumerable<string> GetReferencePaths()
4687
{
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System.Collections.Generic;
5+
using Microsoft.AspNetCore.Mvc.ApplicationParts;
6+
7+
namespace Microsoft.AspNetCore.Mvc.Core.ApplicationParts
8+
{
9+
/// <summary>
10+
/// Exposes a sequence of views associated with an <see cref="ApplicationPart"/> .
11+
/// </summary>
12+
public interface IViewsProvider
13+
{
14+
/// <summary>
15+
/// Gets the sequence of <see cref="ViewInfo"/>.
16+
/// </summary>
17+
IEnumerable<ViewInfo> Views { get; }
18+
}
19+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
6+
namespace Microsoft.AspNetCore.Mvc.ApplicationParts
7+
{
8+
/// <summary>
9+
/// Provides information for precompiled views.
10+
/// </summary>
11+
public class ViewInfo
12+
{
13+
/// <summary>
14+
/// Creates a new instance of <see cref="ViewInfo" />.
15+
/// </summary>
16+
/// <param name="path">The path of the view.</param>
17+
/// <param name="type">The view <see cref="System.Type"/>.</param>
18+
public ViewInfo(string path, Type type)
19+
{
20+
Path = path;
21+
Type = type;
22+
}
23+
24+
/// <summary>
25+
/// The path of the view.
26+
/// </summary>
27+
public string Path { get; }
28+
29+
/// <summary>
30+
/// The view <see cref="System.Type"/>.
31+
/// </summary>
32+
public Type Type { get; }
33+
}
34+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System.Collections.Generic;
5+
6+
namespace Microsoft.AspNetCore.Mvc.ApplicationParts
7+
{
8+
/// <summary>
9+
/// A container for <see cref="ViewInfo"/> instances.
10+
/// </summary>
11+
public class ViewInfoContainer
12+
{
13+
/// <summary>
14+
/// Initializes a new instance of <see cref="ViewInfos"/>.
15+
/// </summary>
16+
/// <param name="views">The sequence of <see cref="ViewInfo"/>.</param>
17+
public ViewInfoContainer(IReadOnlyList<ViewInfo> views)
18+
{
19+
ViewInfos = views;
20+
}
21+
22+
/// <summary>
23+
/// The <see cref="IReadOnlyList{T}"/> of <see cref="ViewInfo"/>.
24+
/// </summary>
25+
public IReadOnlyList<ViewInfo> ViewInfos { get; }
26+
}
27+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using Microsoft.Extensions.DependencyInjection;
5+
6+
namespace Microsoft.AspNetCore.Mvc
7+
{
8+
/// <summary>
9+
/// Configures the <see cref="IMvcBuilder"/>. Implement this interface to enable design-time configuration
10+
/// (for instance during pre-compilation of views) of <see cref="IMvcBuilder"/>.
11+
/// </summary>
12+
public interface IDesignTimeMvcBuilderConfiguration
13+
{
14+
/// <summary>
15+
/// Configures the <see cref="IMvcBuilder"/>.
16+
/// </summary>
17+
/// <param name="builder">The <see cref="IMvcBuilder"/>.</param>
18+
void ConfigureMvc(IMvcBuilder builder);
19+
}
20+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
7+
namespace Microsoft.AspNetCore.Mvc.Razor.Compilation
8+
{
9+
public class ViewsFeature
10+
{
11+
public IDictionary<string, Type> Views { get; } =
12+
new Dictionary<string, Type>(StringComparer.OrdinalIgnoreCase);
13+
}
14+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using Microsoft.AspNetCore.Mvc.ApplicationParts;
7+
using Microsoft.AspNetCore.Mvc.Core.ApplicationParts;
8+
9+
namespace Microsoft.AspNetCore.Mvc.Razor.Compilation
10+
{
11+
/// <summary>
12+
/// An <see cref="IApplicationFeatureProvider{TFeature}"/> for <see cref="ViewsFeature"/>.
13+
/// </summary>
14+
public class ViewsFeatureProvider : IApplicationFeatureProvider<ViewsFeature>
15+
{
16+
/// <inheritdoc />
17+
public void PopulateFeature(IEnumerable<ApplicationPart> parts, ViewsFeature feature)
18+
{
19+
foreach (var provider in parts.OfType<IViewsProvider>())
20+
{
21+
var precompiledViews = provider.Views;
22+
if (precompiledViews != null)
23+
{
24+
foreach (var viewInfo in precompiledViews)
25+
{
26+
feature.Views[viewInfo.Path] = viewInfo.Type;
27+
}
28+
}
29+
}
30+
}
31+
}
32+
}

src/Microsoft.AspNetCore.Mvc.Razor/DependencyInjection/MvcRazorMvcCoreBuilderExtensions.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ private static void AddRazorViewEngineFeatureProviders(IMvcCoreBuilder builder)
7272
{
7373
builder.PartManager.FeatureProviders.Add(new MetadataReferenceFeatureProvider());
7474
}
75+
76+
if (!builder.PartManager.FeatureProviders.OfType<ViewsFeatureProvider>().Any())
77+
{
78+
builder.PartManager.FeatureProviders.Add(new ViewsFeatureProvider());
79+
}
7580
}
7681

7782
/// <summary>
@@ -127,6 +132,8 @@ public static IMvcCoreBuilder InitializeTagHelper<TTagHelper>(
127132
// Internal for testing.
128133
internal static void AddRazorViewEngineServices(IServiceCollection services)
129134
{
135+
services.TryAddSingleton<CSharpCompiler>();
136+
services.TryAddSingleton<RazorReferenceManager>();
130137
// This caches compilation related details that are valid across the lifetime of the application.
131138
services.TryAddSingleton<ICompilationService, DefaultRoslynCompilationService>();
132139

@@ -165,7 +172,7 @@ internal static void AddRazorViewEngineServices(IServiceCollection services)
165172
// creating the singleton RazorViewEngine instance.
166173
services.TryAddTransient<IRazorPageFactoryProvider, DefaultRazorPageFactoryProvider>();
167174
services.TryAddTransient<IRazorCompilationService, RazorCompilationService>();
168-
services.TryAddTransient<IMvcRazorHost,MvcRazorHost>();
175+
services.TryAddTransient<IMvcRazorHost, MvcRazorHost>();
169176

170177
// This caches Razor page activation details that are valid for the lifetime of the application.
171178
services.TryAddSingleton<IRazorPageActivator, RazorPageActivator>();
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using Microsoft.CodeAnalysis;
5+
using Microsoft.CodeAnalysis.CSharp;
6+
using Microsoft.CodeAnalysis.Emit;
7+
using Microsoft.CodeAnalysis.Text;
8+
using Microsoft.Extensions.Options;
9+
10+
namespace Microsoft.AspNetCore.Mvc.Razor.Internal
11+
{
12+
public class CSharpCompiler
13+
{
14+
private readonly CSharpCompilationOptions _compilationOptions;
15+
private readonly CSharpParseOptions _parseOptions;
16+
private readonly RazorReferenceManager _referenceManager;
17+
private readonly DebugInformationFormat _pdbFormat =
18+
#if NET451
19+
SymbolsUtility.SupportsFullPdbGeneration() ?
20+
DebugInformationFormat.Pdb :
21+
DebugInformationFormat.PortablePdb;
22+
#else
23+
DebugInformationFormat.PortablePdb;
24+
#endif
25+
26+
public CSharpCompiler(RazorReferenceManager manager, IOptions<RazorViewEngineOptions> optionsAccessor)
27+
{
28+
_referenceManager = manager;
29+
_compilationOptions = optionsAccessor.Value.CompilationOptions;
30+
_parseOptions = optionsAccessor.Value.ParseOptions;
31+
EmitOptions = new EmitOptions(debugInformationFormat: _pdbFormat);
32+
}
33+
34+
public EmitOptions EmitOptions { get; }
35+
36+
public SyntaxTree CreateSyntaxTree(SourceText sourceText)
37+
{
38+
return CSharpSyntaxTree.ParseText(
39+
sourceText,
40+
options: _parseOptions);
41+
}
42+
43+
public CSharpCompilation CreateCompilation(string assemblyName)
44+
{
45+
return CSharpCompilation.Create(
46+
assemblyName,
47+
options: _compilationOptions,
48+
references: _referenceManager.CompilationReferences);
49+
}
50+
}
51+
}

0 commit comments

Comments
 (0)