代码之家  ›  专栏  ›  技术社区  ›  remi bourgarel

Visual Studio是否更改目标运行时?

  •  2
  • remi bourgarel  · 技术社区  · 14 年前

    我的一个同事对他的Dev env有点问题(Win 7+vs 2010):

    我们有一个引用.NET 2.0的类库项目,如果我们用“debug”构建它并用reflector打开它,我们会看到“target runtime:2.0…”,如果我们用“release”配置构建它,我们会看到“target runtime:v4.0”(如果我们在测试服务器中使用它,我们会看到“th”这样的消息错误。程序集是由比“”更新的运行时生成的吗?

    在项目属性中,我可以看到“.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 回复  |  直到 14 年前
        1
  •  2
  •   Peter Hahndorf    14 年前

    我遇到了同样的问题:vs10中的一个3.5目标类库在reflector中的目标运行时为v4.0,并且在仅支持的运行时设置为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)"