C#解决方案中System.Drawing版本冲突及自引用问题求助
问题
我有一个包含约20个项目的C#解决方案,其中一个项目构建时出现MSB3277警告:无法解析不同版本System.Drawing之间的冲突,涉及版本4.0.0.0与6.0.2.0。系统选择了4.0.0.0版本,因其为主要版本。依赖6.0.2.0版本的是解决方案内的其他项目,但依赖4.0.0.0版本的似乎是该项目自身,找不到阻止这种自引用的方法,求解决建议。
构建警告详情
9>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets(2364,5): warning MSB3277: Found conflicts between different versions of "System.Drawing" that could not be resolved. 9>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets(2364,5): warning MSB3277: There was a conflict between "System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" and "System.Drawing, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". 9>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets(2364,5): warning MSB3277: "System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" was chosen because it was primary and "System.Drawing, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" was not. 9>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets(2364,5): warning MSB3277: References which depend on "System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" [C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Drawing.dll]. 9>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets(2364,5): warning MSB3277: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Drawing.dll 9>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets(2364,5): warning MSB3277: Project file item includes which caused reference "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Drawing.dll". 9>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets(2364,5): warning MSB3277: System.Drawing 9>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets(2364,5): warning MSB3277: References which depend on "System.Drawing, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" [].
解决建议
1. 核对项目目标框架
从警告路径能看出,出问题的项目用的是.NET Framework 4.8,而依赖6.0.2.0的项目应该是基于.NET 6+的。先明确这个项目能不能升级框架:
- 能升级的话,直接把目标框架改成.NET 6或更高,.NET 6+里System.Drawing已经移到NuGet包
System.Drawing.Common,升级后自动对齐版本,冲突直接解决。 - 不能升级的话,接着往下操作。
2. 添加程序集绑定重定向
在出问题项目的App.config或Web.config里加一段配置,强制所有System.Drawing引用指向同一个版本:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Drawing" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <!-- 把所有旧版本重定向到你要保留的版本,这里用4.0.0.0为例 --> <bindingRedirect oldVersion="0.0.0.0-6.0.2.0" newVersion="4.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
要是想统一用6.0.2.0,先确认.NET Framework 4.8兼容这个版本,再把newVersion改成6.0.2.0。
3. 清理项目引用
- 打开出问题项目的引用列表,找到
System.Drawing,右键查看属性,确认版本是4.0.0.0,删掉重复的引用。 - 右键项目→选择“项目依赖项”→切换到“依赖项”标签,查看所有间接引用,排查是否有其他项目传递过来的6.0.2.0版本System.Drawing。
4. 统一NuGet包版本
如果项目使用了System.Drawing.Common NuGet包,确保所有项目的版本一致:
- 打开解决方案的NuGet包管理器,把所有项目的
System.Drawing.Common版本统一成同一个(比如4.0.0.0对应NuGet包版本4.7.0,6.0.2.0对应6.0.2)。 - 要是出问题的项目没装这个包但间接引用了,直接安装对应版本的包,覆盖默认的框架引用。
5. 手动修改项目文件
前面的方法都无效的话,直接编辑项目的.csproj文件:
- 找到
<Reference Include="System.Drawing" />这一行,改成明确指定版本和路径的写法:
<Reference Include="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <HintPath>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Drawing.dll</HintPath> </Reference>
- 同时删掉任何可能存在的旧版本
System.Drawing.Common引用。
内容的提问来源于stack exchange,提问作者KirkD-CO
相关产品推荐
相关产品推荐

