.NET 8.0项目构建失败:无法加载System.Runtime,引用程序集不可执行加载
我有一个同时面向net8.0-windows和net48的多目标项目,两种配置下均无警告或错误。net48版本可正常构建,但构建net8.0-windows版本时出现如下错误:
1>Done building project "KeynoteManager.Core_4arjhlci_wpftmp.csproj".
1>LC : error LC0000: 'Could not load file or assembly 'System.Runtime, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)'
1>Done building project "KeynoteManager.Core.csproj" -- FAILED.
已尝试但无效的操作:
- 引用System.Runtime NuGet包(无4.2.2版本,试用4.3.0无效)
- 清理
bin和obj文件夹、重启机器、重新克隆仓库 - 移除框架目标的相关包
补充说明:构建输出中出现带wpftmp后缀的临时项目,但系统中找不到该项目文件。
1. 调整WPF资源生成配置
这个错误和License Compiler(LC)工具相关,wpftmp临时项目是WPF构建流程自动生成的。在项目文件中针对net8.0-windows添加以下配置,强制使用序列化资源加载方式,避免程序集加载冲突:
<PropertyGroup Condition="'$(TargetFramework)' == 'net8.0-windows'"> <GenerateResourceUsePreserializedResources>true</GenerateResourceUsePreserializedResources> <UseWPF>true</UseWPF> </PropertyGroup>
2. 明确指定System.Runtime程序集路径
在项目文件中为net8.0-windows框架手动指定System.Runtime的正确引用路径,避免加载错误版本:
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0-windows'"> <Reference Include="System.Runtime"> <HintPath>C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.0\System.Runtime.dll</HintPath> <Private>False</Private> </Reference> </ItemGroup>
注意将路径中的8.0.0替换为你实际安装的.NET 8版本号。
3. 禁用License Compiler(临时规避)
如果项目不需要使用License Compiler功能,可以在项目文件中针对net8.0-windows禁用LC工具:
<PropertyGroup Condition="'$(TargetFramework)' == 'net8.0-windows'"> <GenerateLicenseFile>false</GenerateLicenseFile> </PropertyGroup>
4. 对比正常项目的配置差异
既然有其他同配置项目可以正常构建,导出这些项目的.csproj文件,和当前项目逐行对比,重点检查:
- 框架专属的
PropertyGroup配置项 - NuGet包的版本和引用方式
- WPF相关的开关属性
内容的提问来源于stack exchange,提问作者sfaust

