Visual Studio changing my target runtime?

Refresh

December 2018

Views

2.2k time

2

A colleague of mine has a little problem with his dev env (Win 7 + VS 2010):

We have a class librairy project which reference .net 2.0, if we build it with "Debug" and open it with Reflector, we can see "Target Runtime : 2.0..." if we build it with "Release" configuration, we can see "Target Runtime : v4.0" (and if we use it in our test server we have message error like "This assembly is built by a runtime newer than")

In the project properties I can see ".net framework 2.0" .In my .csproj, I have

<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>

Do you have any idea?

EDIT

here is the beginning of my .csproj

<Project ToolsVersion="2.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>9.0.30729</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{E7122A64-C206-47EB-A511-763FF9C9D560}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>ControlSkin3</RootNamespace>
    <AssemblyName>ControlSkin3</AssemblyName>
    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <Nonshipping>true</Nonshipping>
    <SccProjectName>SAK</SccProjectName>
    <SccLocalPath>SAK</SccLocalPath>
    <SccAuxPath>SAK</SccAuxPath>
    <CodeAnalysisCulture>en-en</CodeAnalysisCulture>
    <TargetCulture>en-en</TargetCulture>
    <SccProvider>SAK</SccProvider>
    <TargetFrameworkProfile />
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
  </PropertyGroup>

1 answers

2

Я столкнулся с той же проблемой, где 3,5 целевой библиотеки классов в VS10 выходит с Target режима исполнения v4.0 в рефлектор и вызвал проблемы при использовании в приложениях, где только supportedRuntime устанавливается в v2.0.

В моем случае это было связано с событием после построения, который де-монтирует сборка делает некоторые магии, а затем «монтирует» это опять же, как это:

call "$(DevEnvDir)..\Tools\vsvars32.bat"
ildasm "$(TargetFileName)" /out=myassembly.il /nobar /linenum 
magic.exe myassembly.il ilasm myassembly.changed.il
ilasm myassembly.changed.il /DLL /OUTPUT="$(TargetFileName)"

Это прекрасно работает в VS2008, так как переменная окружения путь указывает на версию v2.0 рамок. В VS 2010, кажется, они указывают на версии v4.0, поэтому, когда IL обрабатывается создает 4.0 код.

ilasm.exe не имеет переключателя, чтобы сказать ему, чтобы построить для версии v2.0, но существует в определенных версиях для каждой рамочной версии. Чтобы исправить это для меня, я сделал указать полный путь к инструментам:

call "$(DevEnvDir)..\Tools\vsvars32.bat"
"%WindowsSdkDir%bin\ildasm "$(TargetFileName)" /out=myassembly.il /nobar /linenum 
magic.exe myassembly.il ilasm myassembly.changed.il
%FrameworkDir%\v2.0.50727\ilasm myassembly.changed.il /DLL /OUTPUT="$(TargetFileName)"