3

我正在尝试将我的 .NET 2.0 C++/CLI 项目从 VS2008 迁移到 VS2012。转换后项目依赖4.0。当我做

<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>

该项目依赖于 2.04.0。我通过查看解决方案资源管理器中的 External Dependencies 魔术文件夹来验证这一点。当我在 2.0 C# 项目中引用该项目时,它也会给我编译器警告。

注释掉 #includes 表明 4.0 依赖项是通过 Microsoft 头文件(如 vcclr.h 和 atlbase.h)中的 #using 指令引入的。

我需要这些标头用于它们提供的类和函数。如何使其中的#using 指令指向 mscorlib.dll 的 2.0 版本而不是 4.0?

4

2 回答 2

4

更改<TargetFrameworkVersion>还不够,构建工具仍然使用安装在您机器上的 .NET 4 版本。通过在生成的程序集上运行 ildasm.exe 可以看到一些内容。双击清单以查看:

// Metadata version: v4.0.30319
...
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .hash = (DD 9E C9 8D BF 2A 2D C2 AA 2D C3 8B 51 CD 4C A6   // .....*-..-..Q.L.
           15 F0 22 F6 )                                     // ..".
  .ver 2:0:0:0
}
...
.assembly extern mscorlib as mscorlib_4
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .hash = (47 6E C0 E3 BA CD CE B1 9A 4D 68 BE 29 75 61 6F   // Gn.......Mh.)uao
           BE 04 C6 BA ) 
  .ver 4:0:0:0
}

请注意这两个版本的 mscorlib.dll 如何最终成为依赖项。你遇到的问题。

我链接的反馈文章建议将工具集更改为“v90”。然而,这在我的机器上不起作用,即使我安装了 VS2008。该选项未显示在组合框下拉列表中,当我强制它时,我收到此构建错误:

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.Cpp.Platform.targets(43,5):错误 MSB8020:Visual Studio 2008 的构建工具(Platform Toolset = 'v90 ') 找不到。要使用 v90 构建工具进行构建,请单击“项目”菜单或右键单击解决方案,然后选择“更新 VC++ 项目...”。安装 Visual Studio 2008 以使用 Visual Studio 2008 构建工具进行构建。

按照错误消息中给出的建议,我得到了这个:

------ Update VC++ projects started -------
Updating project 'ConsoleApplication74'...
    Configuration 'Debug|Win32': changing Platform Toolset to 'v110' (was 'v90').
    Configuration 'Release|Win32': no update required. Platform Toolset is 'v110'.
    TargetFrameworkVersion = v4.5 (was v2.0)

回到原点。我想说,在 C++/CLI 项目中使用 VS2012 来定位 .NET 2.0 是一个失败的原因。

于 2013-04-29T20:48:35.047 回答
1

一种方法是打开项目文件 (.vcxproj) 并更改

<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>

<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>

请参阅使用 vs2010 将 C++/CLI 项目更改为 4.0 以外的其他框架

于 2013-04-03T16:19:40.050 回答