CSC : warning CS1685: The predefined type ‘System.Runtime.CompilerServices.ExtensionAttribute’ is defined in multiple assemblies in the global alias
In one of my ASP.NET MVC 5 projects that targets .NET 4.5.1
, I noticed that I was getting a new compiler warning at build time:
CSC : warning CS1685: The predefined type 'System.Runtime.CompilerServices.ExtensionAttribute' is defined in multiple assemblies in the global alias
On a hunch, I fired up JetBrains dotPeek, loaded all of the assemblies in my bin
directory, and did a Type search (Navigate
-> Go to Everything / Type...
). It turns out that Json.NET actually implements its own version of ExtensionAttribute
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Type: System.Runtime.CompilerServices.ExtensionAttribute
// Assembly: Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
// MVID: 2CCEAD7E-60D5-4E86-87A2-3819FCE6C567
// Assembly location: (redacted)\bin\Newtonsoft.Json.dll
using System;
namespace System.Runtime.CompilerServices
{
///
/// This attribute allows us to define extension methods without
/// requiring .NET Framework 3.5. For more information, see the section,
/// <a href="http://msdn.microsoft.com/en-us/magazine/cc163317.aspx#S7">Extension Methods in .NET Framework 2.0 Apps</a>,
/// of <a href="http://msdn.microsoft.com/en-us/magazine/cc163317.aspx">Basic Instincts: Extension Methods</a>
/// column in <a href="http://msdn.microsoft.com/msdnmag/">MSDN Magazine</a>,
/// issue <a href="http://msdn.microsoft.com/en-us/magazine/cc135410.aspx">Nov 2007</a>.
///
///
[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
internal sealed class ExtensionAttribute : Attribute
{
}
}
Back in my web project, I looked at the properties for Newtonsoft.Json
and noticed that the Runtime Version
was set to v2.0.something
. After reading through this Json.NET discussion thread on the matter, I decided to reinstall the NuGet package:
1
PM> Update-Package Newtonsoft.Json -Reinstall
And voilà! Newtonsoft.Json
’s properties once again showed that Runtime Version
points to v4.0.30319
, and the compiler warning went away. This modified my .csproj file, and diffing it immediately revealed the source of the problem. Newtonsoft.Json
’s hint path had somehow been set to this:
1
..packages\Newtonsoft.Json.6.0.3\lib\net20\Newtonsoft.Json.dll
Instead of this:
1
..packages\Newtonsoft.Json.6.0.3\lib\net45\Newtonsoft.Json.dll
Hope this helps.