【问题标题】:ASP.NET Core Runtime Compilation fails with "Cannot find compilation library location for package" for dynamically loaded Razor Class Library对于动态加载的 Razor 类库,ASP.NET Core 运行时编译失败并显示“找不到包的编译库位置”
【发布时间】:2019-11-11 08:20:58
【问题描述】:

我正在使用以下代码将 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);
}

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

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

编辑*.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(int index, IEnumerable collection)
  • Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.RazorReferenceManager.GetReferencePaths()

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

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

【问题讨论】:

  • 你有没有尝试过这样的事情:services.AddControllersWithViews() .AddRazorRuntimeCompilation(options =&gt; options.FileProviders.Add( new PhysicalFileProvider(appDirectory)));
  • @Rena 感谢您的意见,但这并没有帮助:-(

标签: c# asp.net-mvc asp.net-core razor plugins


【解决方案1】:

我能够通过使用 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>

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

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

【讨论】:

  • 这对我也很有效;虽然我不太确定为什么会这样。你能帮我更好地理解它吗?
猜你喜欢
  • 2018-12-18
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
相关资源
最近更新 更多