使用$(SolutionDir)配置ProjectReference时无法加载Logging程序集的问题
问题:使用$(SolutionDir)配置项目引用导致运行时找不到程序集
我通过Directory.Build.props批量给解决方案内项目添加Logging项目引用,配置如下:
<Project> <PropertyGroup> <TargetFramework>net7.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <LangVersion>preview</LangVersion> </PropertyGroup> <ItemGroup> <ProjectReference Condition="'$(MSBuildProjectName)' != 'X' And '$(MSBuildProjectName)' != 'Y' And '$(MSBuildProjectName)' != 'Logging'" Include="$(SolutionDir)\Libraries\Logging\Logging.csproj"/> </ItemGroup> </Project>
运行解决方案内的控制台应用时,触发以下错误:
System.IO.FileNotFoundException: Could not load file or assembly 'Logging, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
IDE的自动补全、命名空间导入等功能都正常,手动用相对路径添加引用则能正常运行:
<ProjectReference Include="..\Libraries\Logging\Logging.csproj"/>
问题原因
核心问题是$(SolutionDir)这个MSBuild变量本身就以反斜杠()结尾,而你在引用路径里额外加了一个反斜杠,导致最终生成的路径出现重复的反斜杠(比如C:\MySolution\\Libraries\Logging\Logging.csproj)。
MSBuild在编译阶段能兼容这种格式错误,所以IDE功能、项目编译都正常,但运行时的程序集解析逻辑对路径格式更严格,无法正确识别重复反斜杠的路径,导致找不到输出的Logging.dll。
解决方案
有两种简单的修复方式:
- 移除路径中的额外反斜杠
直接利用$(SolutionDir)自带的结尾反斜杠拼接路径,修改后的ProjectReference配置如下:
<ProjectReference Condition="'$(MSBuildProjectName)' != 'X' And '$(MSBuildProjectName)' != 'Y' And '$(MSBuildProjectName)' != 'Logging'" Include="$(SolutionDir)Libraries\Logging\Logging.csproj"/>
- 改用相对路径结合项目目录变量(可选)
如果担心SolutionDir的路径问题,也可以用$(MSBuildProjectDirectory)结合相对路径,不过这种方式需要根据项目位置调整相对层级:
<ProjectReference Condition="'$(MSBuildProjectName)' != 'X' And '$(MSBuildProjectName)' != 'Y' And '$(MSBuildProjectName)' != 'Logging'" Include="$(MSBuildProjectDirectory)\..\Libraries\Logging\Logging.csproj"/>
修改完成后,清理并重新生成整个解决方案,运行控制台应用即可解决程序集找不到的问题。
内容的提问来源于stack exchange,提问作者Mário Gabriel
相关产品推荐
相关产品推荐

