预定义类型“System.Action”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framew

本文介绍在Microsoft Visual Studio 2010中重新生成解决方案时出现的关于预定义类型System.Action和System.Func在多个程序集中重复定义的问题及解决办法。问题源于项目引用了Newtonsoft.Json.Net20导致系统类重名。
Microsoft Visual Studio 2010 重新生成解决方案的一些警告处理

警告 2 预定义类型“System.Action”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll”中的定义 ClassLibrary1


警告 3 预定义类型“System.Action”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll”中的定义 ClassLibrary1


警告 4 预定义类型“System.Action”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll”中的定义 ClassLibrary1


警告 5 预定义类型“System.Action”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll”中的定义 ClassLibrary1


警告 6 预定义类型“System.Func”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll”中的定义 ClassLibrary1


警告 7 预定义类型“System.Func”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll”中的定义 ClassLibrary1


警告 8 预定义类型“System.Func”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll”中的定义 ClassLibrary1


警告 9 预定义类型“System.Func”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll”中的定义 ClassLibrary1


警告 10 预定义类型“System.Func”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll”中的定义 ClassLibrary1


问题原因:检查程序发现,由于项目中引用了Newtonsoft.Json.Net20,从而造成系统的类重名(项目FRAMEWORK的版本4.0)。


下载地址:猛戳这里

Newtonsoft.Json.Net 包括: .NET 2, .NET 3.5, .NET 4, .NET 4.5, Silverlight, Windows Phone and Windows 8 Store,所有dll文件和源码,有需要的同学可以直接下载。
编译器警告 **CS1685** 表示预定义类型 `System.ObsoleteAttribute` 在多个程序集中定义。该警告通常出现在项目中引用了多个包含相同类型定义程序集,导致编译器在解析类型时产生歧义。虽然该警告本身不会中断编译过程,但可能会影响运行时行为或造成潜在的兼容性问题。 ### 问题分析 在 .NET 框架中,`System.ObsoleteAttribute` 是一个预定义的特性类型,通常由编译器隐式使用。该类型应当仅由 `mscorlib.dll` 提供。当项目中引用了多个包含相同定义程序集时,例如第三方库或自定义的 `mscorlib` 替代实现,编译器会发出警告,提示类型定义冲突,并选择使用 `mscorlib.dll` 中的定义[^1]。 这种问题常见于以下场景: - 项目中同时引用了不同版本的 .NET 框架库。 - 使用了自定义的 CoreCLR 或 Mono 运行时,其中包含重复的系统类型定义。 - 引用了包含嵌入式系统类型(如 `System` 命名空间)的第三方库。 ### 解决方案 为了解决该问题,应确保项目中所有引用的程序集都来自一致的运行时环境,并避免引入重复的系统类型定义。 #### 1. 检查项目引用 在项目文件(如 `.csproj`)中检查是否有重复的引用,尤其是 `mscorlib.dll` 或其他包含 `System` 类型程序集。移除任何非必要的重复引用。 ```xml <ItemGroup> <Reference Include="mscorlib" /> <!-- 确保没有重复的 System 程序集引用 --> </ItemGroup> ``` #### 2. 使用统一的 SDK 和运行时版本 确保项目使用的是统一的 .NET SDK 和运行时版本。不同版本之间可能存在类型定义的冲突。可以通过在项目文件中指定目标框架来统一运行时环境: ```xml <PropertyGroup> <TargetFramework>net5.0</TargetFramework> </PropertyGroup> ``` #### 3. 避免使用嵌入式系统类型库 某些第三方库可能会嵌入 `System` 命名空间的类型定义以兼容旧环境。如果可能,应避免使用这些库,或联系供应商获取兼容的版本。 #### 4. 使用 `extern alias` 解决类型冲突 若无法移除冲突的程序集,可使用 `extern alias` 来明确指定使用哪个程序集中类型。例如: ```csharp extern alias MS; // 在代码中使用 MS::System.ObsoleteAttribute ``` 并在项目文件中为程序集指定别名: ```xml <ItemGroup> <Reference Include="mscorlib"> <Aliases>MS</Aliases> </Reference> </ItemGroup> ``` #### 5. 升级开发工具链 如果使用的是较旧的 .NET 编译器版本,建议升级到最新版本,以获得更好的类型解析机制和兼容性支持。新版编译器通常能够更智能地处理多程序定义的情况。 --- ### 总结 编译器警告 **CS1685** 是由于多个程序集中定义了相同的系统类型 `System.ObsoleteAttribute` 所引发的。解决该问题的关键在于统一项目中的运行时环境、移除重复引用,并避免使用嵌入系统类型的第三方库。通过合理的项目配置和工具链升级,可以有效避免此类警告。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值