Visual Studio改变我的目标运行时?

时间:2010-10-05 16:05:06

标签: .net visual-studio msbuild

我的一位同事对他的开发环境(Win 7 + VS 2010)有一点问题:

我们有一个类librairy项目引用.net 2.0,如果我们使用“Debug”构建它并使用Reflector打开它,如果我们使用“Release”配置构建它,我们可以看到“Target Runtime:2.0 ...” ,我们可以看到“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 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,VS10中的3.5目标类库在Reflector中出现了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)"