Visual Studio меняет целевую среду выполнения? - PullRequest
2 голосов
/ 05 октября 2010

У моего коллеги есть небольшая проблема с его dev env (Win 7 + VS 2010):

У нас есть проект библиотеки классов, который ссылается на .net 2.0, если мы собираем его с помощью "Debug" иоткройте его с помощью Reflector, мы увидим «Target Runtime: 2.0 ...», если мы создадим его с конфигурацией «Release», мы увидим «Target Runtime: v4.0» (и если мы используем его на нашем тестовом сервере, мы имеемсообщение об ошибке типа «Эта сборка построена во время выполнения новее, чем»)

В свойствах проекта я вижу «.net framework 2.0». В моем .csproj у меня есть

<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>

Есть ли у вас какие-либо идеи?

РЕДАКТИРОВАТЬ

вот начало моего .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 Ответ

2 голосов
/ 12 ноября 2010

Я столкнулся с той же проблемой, когда целевая библиотека классов 3.5 в VS10 выходит с Target Runtime v4.0 в Reflector и вызывает проблемы при использовании в приложениях, в которых для параметра only selectedRuntime установлено значение 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, потому что переменная среды path указывает на версию 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)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...