为啥原生 C++ 项目有 TargetFrameworkVersion?
Posted
技术标签:
【中文标题】为啥原生 C++ 项目有 TargetFrameworkVersion?【英文标题】:Why do native C++ projects have a TargetFrameworkVersion?为什么原生 C++ 项目有 TargetFrameworkVersion? 【发布时间】:2014-02-18 06:06:42 【问题描述】:在 Visual Studio(v100、v110)中,可以使用项目文件中的 TargetFrameworkVersion 元素指定项目所针对的 .NET 框架版本。 (如果没有 TargetFrameworkVersion 元素,IDE 仅使用其默认的 .NET 版本。)然后使用指定的 TargetFrameworkVersion 选择(默认)工具链,该工具链将用于构建项目。
上述情况对于 CLR 和本机 C++ 项目都是正确的。我觉得这真的很奇怪和令人困惑。如果 Visual Studio 知道一个项目是原生的,那么它为什么要关心 TargetFrameworkVersion 是什么?
【问题讨论】:
【参考方案1】:好吧,实际上您必须询问负责创建MSBuild 脚本的开发人员,因为原则上它并不真正需要,也不需要使用。他们自己也知道。对于标准 C++ 项目文件,这些是导致设置属性的行 (Microsoft.Common.targets):
<!-- By default, we are creating a managed app because .NET 2.0 projects did not have this property. -->
<PropertyGroup Condition="'$(TargetRuntime)' == ''">
<TargetRuntime>Managed</TargetRuntime>
</PropertyGroup>
<!-- Because .NET 2.0 apps did not set TargetFrameworkIdentifier, we need to set it for them here by default. If
the runtime is set to Managed, we also need to set these. Otherwise they should be blank (for instance javascript or
Native apps) because they do not target a .NET Framework. -->
<PropertyGroup Condition="'$(TargetRuntime)' == 'Managed'">
<TargetFrameworkIdentifier Condition="'$(TargetFrameworkIdentifier)' == ''">.NETFramework</TargetFrameworkIdentifier>
<TargetFrameworkVersion Condition=" '$(TargetFrameworkVersion)' == '' ">v4.0</TargetFrameworkVersion>
</PropertyGroup>
【讨论】:
【参考方案2】:基本上是懒惰的编程。微软历来更喜欢托管代码,因为它不能真正移植到其他操作系统,从而导致锁定。因此 .NET 语言在 Visual Studio 中具有更高的优先级。
【讨论】:
嗯,这是一个非常多的假设......除了个人偏见之外,任何实际的事实、参考资料或任何东西都可以支持这一点? @Basic 好吧,懒惰的编程,基本上。我的答案中的代码支持 Microsoft 历来首选的托管代码 语句。然而原因:那是另一回事:] @stijn 这就是我的观点。我知道 MS 是 pro-.Net 并且我确信锁定发挥了作用,但这是从那里到“历史上首选......因为它不便携”的一大飞跃。顺便说一句,努力挖掘导致问题的节点。这就是我为你 +1 的原因。以上是关于为啥原生 C++ 项目有 TargetFrameworkVersion?的主要内容,如果未能解决你的问题,请参考以下文章
为啥某些 C++ 项目构建显示 00:00:00 已用时间并且没有输出窗口详细信息?
为啥包含枚举的 C++ 方法会导致 SWIG/C# 中的 AccessViolationExceptions?