如何更改 .Views.dll 中预编译视图的默认命名并使用该名称通过控制器操作调用?

How can I change the default naming of a precompiled View in .Views.dll and use that name to call via Controller action?

我正在尝试使用 ASP.Net Core 2.2 和 MVC 构建模块化架构。本质上,我有一个基础 ASP.Net Core 2.2 网络应用程序。然后我想继续添加 class 库作为我的应用程序的功能。我通过配置 AreaViewLocationFormats 路由到这些功能。 我的 Class 库针对 SDK - Microsoft.NET.Sdk.Razor。在构建时我确实看到了 .Views.dll 并且我的基本应用程序能够扫描这些并添加到应用程序工厂。

在应用程序启动时,我正在扫描这些 class 库的 dll 和 Views.dll,然后像这样将它们添加到应用程序部分(我已经简化了这个以便我可以分享):

foreach (var file in plugInFolder.GetFileSystemInfos("*.dll", SearchOption.AllDirectories))
                {
                    Assembly assembly;
                    try
                    {
                        assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(file.FullName);
                    }
                    catch (FileLoadException ex)
                    {
                        // If assembly is already loaded, we'll just catch it and continue to the next one, plugins can have same dependencies:
                        if (ex.Message == "Assembly with same name is already loaded")
                        {
                            continue;
                        }
                        throw;
                    }


                    //If its a View Assembly then we need to load it differently:
                    if (assembly.FullName.Contains(".Views"))
                    {
                        mvcBuilder.ConfigureApplicationPartManager(mgr => {
                            foreach (var b in CompiledRazorAssemblyApplicationPartFactory.GetDefaultApplicationParts(assembly))
                            {                                
                                mvcBuilder.ConfigureApplicationPartManager(apm => apm.ApplicationParts.Add(b));
                            }

                        });

                    }
                    // If plugin hasn't been loaded already
                    else if (!plugins.ContainsKey(pluginFolder.Name) &&   // plug in isn't loaded already and
                            pluginFolder.Name == assembly.GetName().Name) // plug in Name matches Folder Name {Our convention}
                    {
                        plugins.Add(pluginFolder.Name, new PlugInInfo { Name = pluginFolder.Name, Assembly = assembly, Path = pluginFolder.PhysicalPath });
                        //plugin load:
                        mvcBuilder.AddApplicationPart(assembly);


                    }


                }

问题出在 Views.dll 上,因为它们具有以下奇怪的属性(通过 ILSpy 检查):

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: RazorCompiledItem(typeof(Views_Home_Index), "mvc.1.0.view", "/Views/Home/Index.cshtml")]
[assembly: RazorView("/Views/Home/Index.cshtml", typeof(Views_Home_Index))]

我认为由于上面编译中的“/Views/Home/Index.cshtml”,如果我使用

,我只能调用我的视图
return View("/Views/Home/Index.cshtml")

问题是 - 我不能对其他 class 库使用相同的 Views-Home-Index 命名。 现在,我可以在不预编译视图和使用 cshtml 文件的情况下解决问题。但我想利用预编译视图的优势。 我已经参考了 Razor SDK 的 MS 文档,但未能获得适当的帮助,或者我可能错过了一些东西。 我能做些什么来修复编译视图的这些名称吗?请指导。

我相信命名是根据 MVC 约定来自视图的位置,但我希望能够通过

调用我的视图
return View("<FeatureName>/Views/Home/Index.cshtml");

但目前它只适用于:

return  View("Views/Home/Index.cshtml");

我联系了 aspnet 核心团队,得到了答复。如果您也被困在这里,请参考以下内容并对我的问题投赞成票:) https://github.com/aspnet/AspNetCore/issues/7112