【发布时间】:2012-05-30 22:00:38
【问题描述】:
总结
我在使用 Visual Studio 2010 时遇到了一个非常奇怪的行为,我不确定这是否是一个错误,或者它为什么会出现这种行为是否存在一些扭曲的逻辑。
执行摘要是,当我使用 Batch Build->Select All->Rebuild 为我的所有项目构建所有配置时,VS2010 会根据当前选择的解决方案配置生成不同的输出二进制文件。这真的很烦人,因为某些项目输出无法正确运行(在启动时给出“[项目名称] 已停止工作”错误对话框)取决于在批量构建期间选择了哪个解决方案配置。
更多详情
我有一个包含 3 个 C# 项目的解决方案(1 个 .dll 输出项目,由其他 2 个 .exe 输出项目引用)。在 .exe 输出项目中,项目 A 具有 Release 和 Debug 项目配置。 项目 B 具有 Debug、Release-x86 和 Release-x64 配置,因为它需要运行一些不同的构建后脚本才能为其提供正确的版本 3rd 方库。
我有 4 个解决方案配置:Debug、Release、Release-x86 和 Release-x64。 Release-x86 和 -x64 设置为仅构建项目 B。Release 和 Debug 构建项目 A 和共享 dll 项目。
如果我从当前配置下拉框中选择Debug 解决方案配置,然后全部批量构建,那么当我尝试运行项目 A 的发布配置时,它无法运行。如果我从下拉列表中选择任何其他解决方案配置,然后全部批量构建,则它会成功运行。当我比较生成的 .exe 文件时,我可以看到这两种情况有所不同。
问题
这是 VS2010 的一些已知预期行为吗?如果是这样,有人可以提示为什么会出现这个问题以及如何解决它?这是VS2010的bug吗?
后续线索? [编辑]
这可能与 VS2010 处理“项目引用”的方式有关吗?正如我所提到的,两个 .exe 项目都引用了 dll 项目,称之为 Project D。我通过选择添加引用 -> 项目 -> 项目 D 添加了该引用(例如,对项目 A)。当然,项目 A 的不同配置想要使用项目 D 的不同配置版本。当我检查项目 A ->属性下的项目 D 引用,我看到一个不可编辑的路径字段。根据选择的解决方案配置,我会看到...\Project D\bin\Release\Project D.dll 或``...\Project D\bin\Debug\Project D.dll,我没有看到任何控制它的方法,所以我猜VS2010 正在尝试聪明地选择项目配置的细节。但更奇怪的是,如果我选择 Batch Build -> Select All -> Clean 来删除所有已编译的文件,那么当我检查它们时,这些引用路径会更改为 ...\obj\... 而不是 ...\bin\...,而且我似乎无法更改除非删除并重新添加项目引用,否则它们会返回。
跟进 2 [Edit2]
我之前撒了一点谎,我实际上有 2 个 .dll 项目(比如项目 D 和 E),其中 D 通过项目引用引用 E。
我很确定 VS2010 中的项目引用出现问题或异常是罪魁祸首,并认为我已经通过以下步骤找到了所选解决方案配置相关行为的根本原因
1) I Batch Build -> Select All -> Clean,删除所有以前编译的二进制文件。
2) 我从下拉列表中选择一个调试解决方案配置。
3) I Batch Build -> Select Only Project A Release -> Rebuild.
通过查看输出窗口,我看到 VS2010 知道项目 A 依赖于 D,而 D 依赖于 E,因此它尝试以相反的顺序构建它们。它成功构建了项目 E 的 Release 配置。但是它尝试构建项目 D 的 Release 配置但失败,因为它抱怨缺少 E dll 文件的 Debug 版本。同样,由于缺少 D 的 Debug 版本,A 无法构建。
因此,选择解决方案配置似乎覆盖了项目到项目引用中引用项目的配置。
应该是这样吗???
【问题讨论】:
-
您在代码中是否有任何 DEBUG 特定定义会在调试构建时添加额外代码?
-
不,代码中没有#if 语句或编译器指令。
-
您确定所有项目都在使用所选模式构建吗?选择 Build --> Configuration manager 并确保所有项目都与顶部显示的解决方案配置匹配(允许您提到的 x86 和 x64 差异)。
标签: c# visual-studio-2010 visual-studio