views:

558

answers:

2

Visual Studio 2008 did let you reference an assembly A targeting a higher framework version than that of the assembly B that references it.

Visual Studio 2010 doesn't allow for this any more. The full issue is described on MSDN:

You can create applications that reference projects or assemblies that target different versions of the .NET Framework. For example, if you create an application that targets the .NET Framework 4 Client Profile, that project can reference an assembly that targets .NET Framework version 2.0. However, if you create a project that targets an earlier version of the .NET Framework, you cannot set a reference in that project to a project or assembly that targets the .NET Framework 4 Client Profile or the .NET Framework 4. To eliminate the error, make sure that the profile targeted by your application is compatible with the profile targeted by the projects or assemblies referenced by your application.

Is there any way I can get VS2010 to behave like VS2008 in this regard (i.e. allowing references to assemblies targeting higher framework versions)?

I know the reasoning behind the VS 2010 behavior and the deployment considerations I need to be aware of, no need to repeat that.

The exact error is:

warning MSB3268: The primary reference "xxx.dll" could not be resolved because it has an indirect dependency on the framework assembly "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" which could not be resolved in the currently targeted framework. ".NETFramework,Version=v2.0". To resolve this problem, either remove the reference "xxx.dll" or retarget your application to a framework version which contains "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".

+1  A: 

The .NET framework version numbering got to be a mess after 2.0. An assembly does not target a .NET framework version, it targets a CLR version. And the CLR version for framework versions 2.0, 3.0, and 3.5 was the same, 2.0.50727.

Which why it looked like in VS2008 you could mix versions. But you were seeing the [AssemblyVersion] of an assembly, which has nothing to do with the CLR version. Unfortuntely, the CLR version isn't visible in the Properties window, you'd have to run Ildasm.exe to see it in the metadata.

That ended with .NET 4.0, it got a new CLR version, 4.0.30319. What the MSDN blurb is telling you that when you target CLR version 2.0 then you cannot use assemblies that target 4.0. There is no workaround for this, CLR 2.0 cannot load 4.0 assemblies. The other way around is fine.

Hans Passant
I know that, and this is exactly why I'm wondering it doesn't work anymore. None of my projects is a 4.0 project but there are 2.0 projects referencing 3.5 projects (which should work fine).
Johannes Rudolph
I didn't see you mention any kind of error message in your question. Cannot help you without that message.
Hans Passant
@Hans: Thanks for investigating, I have included the relevant error message.
Johannes Rudolph
It is a proper warning message. System.Core.dll is not available on .NET 2.0. You'll need to target 3.5. Feature, not a bug.
Hans Passant
+1  A: 

Step1: Unload the referencing project targeting .NET 2.0

Step2: Right click the unloaded project and select edit from context menu

Step3: Add <SpecificVersion>true</SpecificVersion> to the reference. Below is a sample from my repro solution:

<ProjectReference Include="..\HighFX\HighFX.csproj">
  <Project>{8DD71CAF-BEF7-40ED-9DD0-25033CD8009D}</Project>
  <Name>HighFX</Name>
  <SpecificVersion>true</SpecificVersion>
</ProjectReference>

Step4: Reload the project.

Now your should be able to build within the Visual Studio 2010, there could still be a warning as below, but the build can be successful.

Source: http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/dfadfb34-5328-4c53-8274-931c6ae00836

Johannes Rudolph