ASP.NET Core 2.2独立运行exe时MVC视图未找到问题问询
问题根因
该问题由MVC应用部件(ApplicationPart)注册不全导致:
- 独立类库中初始化MVC时,仅手动注册了应用主程序集,没有将自动生成的Razor预编译视图程序集(
*.Views.dll)注册为应用部件。 - 用Visual Studio或
dotnet run启动时,运行环境会自动读取项目生成的.deps.json依赖配置,把同目录下所有关联程序集(包括视图程序集)自动加载到MVC部件列表中,因此视图可以正常找到。 - 直接运行编译生成的
.exe文件时(目标为.NET Framework 4.8),运行时不会主动解析.deps.json的依赖条目,也不会自动扫描同目录下的视图程序集,MVC视图引擎找不到预编译的视图资源,就会抛出视图未找到的错误。
修复方案
按以下步骤调整配置即可解决:
- 修改类库中的MVC初始化逻辑,显式加载所有预编译视图程序集作为应用部件,参考代码如下:
// 原有MVC注册逻辑 var mvcBuilder = services.AddMvc(); // 首先注册入口程序集 mvcBuilder.AddApplicationPart(Assembly.GetEntryAssembly()); // 显式扫描运行目录下所有预编译视图程序集并注册 var runtimeDir = AppContext.BaseDirectory; foreach (var viewDllPath in Directory.GetFiles(runtimeDir, "*.Views.dll", SearchOption.TopDirectoryOnly)) { try { var viewAssembly = Assembly.LoadFrom(viewDllPath); mvcBuilder.AddApplicationPart(viewAssembly); } catch { // 跳过加载失败的无效程序集 } } - 检查主应用和类库的项目文件(
.csproj),确认以下配置项存在,保证预编译视图正常生成、运行时编译上下文完整:<PropertyGroup> <TargetFramework>net48</TargetFramework> <MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish> <PreserveCompilationContext>true</PreserveCompilationContext> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup> - 确认编译/发布输出目录中,
ApplicationName.Views.dll、LibraryName.Views.dll两个视图程序集和启动.exe处于同一级目录,没有被遗漏或放置到子文件夹。
验证方式
调整完成后重新编译,直接运行生成的exe文件,查看启动日志,会出现和dotnet run启动一致的view path was found调试日志,视图可正常加载渲染。
内容的提问来源于stack exchange,提问作者MaorB
相关产品推荐
相关产品推荐

