对于动态加载的 Razor 类库,ASP.NET Core 运行时编译失败并显示“无法找到包的编译库位置”

Chr*_*Fin 4 c# asp.net-mvc plugins razor asp.net-core

我正在使用以下代码将 Razor 类库动态加载到我的ASP.NET Core 3.0应用程序中:

var pluginAssembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(file.FullName);
var partFactory = ApplicationPartFactory.GetApplicationPartFactory(pluginAssembly);
foreach (var part in partFactory.GetApplicationParts(pluginAssembly))
    MvcBuilder.PartManager.ApplicationParts.Add(part);

var relatedAssemblies = RelatedAssemblyAttribute.GetRelatedAssemblies(pluginAssembly, throwOnError: true);
foreach (var assembly in relatedAssemblies)
{
    partFactory = ApplicationPartFactory.GetApplicationPartFactory(assembly);
    foreach (var part in partFactory.GetApplicationParts(assembly))
        MvcBuilder.PartManager.ApplicationParts.Add(part);
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,控制器和视图最初正在工作。但是,如果我还将Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation包和以下内容添加到Startup.cs

services.Configure<MvcRazorRuntimeCompilationOptions>(options =>
    {
        options.FileProviders.Add(new PhysicalFileProvider(Path.Combine(WebHostEnvironment.ContentRootPath, "..\\AppPlugin")));
    });
Run Code Online (Sandbox Code Playgroud)

我一编辑*.cshtml-file就会收到以下异常:

InvalidOperationException:找不到包“AppPlugin”的编译库位置

  • Microsoft.Extensions.DependencyModel.CompilationLibrary.ResolveReferencePaths(ICompilationAssemblyResolver 解析器,列表程序集)
  • Microsoft.Extensions.DependencyModel.CompilationLibrary.ResolveReferencePaths()

  • Microsoft.AspNetCore.Mvc.ApplicationParts.AssemblyPartExtensions+<>c.b__0_0(CompilationLibrary 库)

  • System.Linq.Enumerable+SelectManySingleSelectorIterator.MoveNext()
  • System.Collections.Generic.List.InsertRange(整数索引,IEnumerable集合)
  • Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.RazorReferenceManager.GetReferencePaths()

  • Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.RazorReferenceManager.GetCompilationReferences()

我还需要加载其他东西才能使其正常工作吗?
如果我从FileProviders运行时编译中省略插件路径,则适用于“非插件视图”。

Pre*_*n S 5

通过使用 razor 类库的以下项目设置,我能够使其工作。关键是将 PreserveCompilationContext 设置为 false。

<Project Sdk="Microsoft.NET.Sdk.Razor">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
    <PreserveCompilationContext>false</PreserveCompilationContext>
  </PropertyGroup>

  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

除此之外,您还必须添加对主插件程序集和视图中使用的任何其他程序集的引用。

services.Configure<MvcRazorRuntimeCompilationOptions>(options =>
{
    options.FileProviders.Add(new PhysicalFileProvider(Path.Combine(WebHostEnvironment.ContentRootPath, "..\\AppPlugin")));
    opts.AdditionalReferencePaths.Add(pluginAssembly.Location);
});
Run Code Online (Sandbox Code Playgroud)