Razor 运行时编译不适用于动态加载的程序集

问题描述

我无法使用 Razor 运行时编译来处理动态加载的程序集。我的代码

const height = window.instance._height function debugLogs() { console.log(height + 'from context menu') } debugLogs()

Startup.cs

使用这种方法,我需要重建加载的程序集项目并重新启动主机以查看更改。当我用以下内容替换最后两行时:

var assembly = Assembly.LoadFrom(someModuleDllPath);
var viewsAssembly = Assembly.LoadFrom(someModuleViewsDllPath);

services.AddControllersWithViews()
    .AddApplicationPart(assembly)
    .AddApplicationPart(viewsAssembly)
    .AddRazorRuntimeCompilation();
            
services.Configure<MvcRazorRuntimeCompilationoptions>(options => { 
    options.FileProviders.Add(new EmbeddedFileProvider(assembly)); 
});

我收到错误

找不到包“”的编译库位置。

services.Configure<MvcRazorRuntimeCompilationoptions>(options => { options.FileProviders.Add(new PhysicalFileProvider(loadedAssemblyProjectContentRootPath)); }); 设置为 MvcRazorExcludeRefAssembliesFrompublish 不会改变任何内容。当我添加对项目的显式引用时,带有 false 的选项有效。

我使用的是 .NET 5 并且两个项目都具有 PhysicalFileProvider 类型。

有什么办法可以让它工作吗?

解决方法

确保 PreserveCompilationContext 的键设置为 false

enter image description here

并且你应该使用当前项目下的路径,即相对路径,如以下代码:

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