为啥 Microsoft.Build.Evaluation 在 64 位 PC 上将 $(ProgramFiles) 评估为“c:\program files”?

Posted

技术标签:

【中文标题】为啥 Microsoft.Build.Evaluation 在 64 位 PC 上将 $(ProgramFiles) 评估为“c:\\program files”?【英文标题】:Why does Microsoft.Build.Evaluation evaluate $(ProgramFiles) as "c:\program files" on 64 bit PC?为什么 Microsoft.Build.Evaluation 在 64 位 PC 上将 $(ProgramFiles) 评估为“c:\program files”? 【发布时间】:2012-07-19 19:08:01 【问题描述】:

我有一个 C# 项目文件 (.csproj),其中包含对 $(ProgramFiles) 的引用。我使用的是 64 位 Windows 7。当我在 Visual Studio 2010 中编译此项目文件时,它会在 c:\Program Files (X86) 中正确定位该文件。

如果我想聪明点,而是使用 Microsoft.Build.Evaluation.ProjectCollection.LoadProject([project file]) 来尝试在代码中构建它,它会评估 $(ProgramFiles)错误地作为 c:\Program Files.

知道问题的原因可能是什么吗?

【问题讨论】:

【参考方案1】:

Visual Studio 2010 是 32 位进程,WOW 将为 32 位进程提供 c:\Program Files (X86)

我的假设:

如果我尝试聪明一点,而是使用 Microsoft.Build.Evaluation.ProjectCollection.LoadProject([project file]) 来尝试在代码中构建它

当你“在代码中”执行它时,你的代码正在执行 x64,所以你得到了正常的环境值。

如果您需要 x86 程序文件目录的路径,您可以使用 x64 中的 ProgramFiles(x86) 环境变量。在 MSBuild 中,这是 $(MSBuildProgramFiles32)

【讨论】:

以上是关于为啥 Microsoft.Build.Evaluation 在 64 位 PC 上将 $(ProgramFiles) 评估为“c:\program files”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?