为什么在 Release 编译期间,Visual Studio 在 /bin/debug/ 中寻找未解决的项目引用?

5
我正在处理一个奇怪的、不理想的项目/解决方案架构,我试图找出是否有一种方法来完成所需的工作。我的情况如下:
我正在开发软件,它被分成两个解决方案,我将它们称为SolutionOne.sln(在VS 2010下构建)和SolutionTwo.sln(在VS 2013下构建)。在SolutionOne中,我们有以下项目:
SolutionOne.sln
- A.csproj - B.csproj - C.csproj(包括对B.csproj的引用)
在SolutionTwo中,我们有几个项目是SolutionTwo独有的,但我们也包括SolutionOne中的“C”项目——但不包括B项目(因为在这个最小的示例之外,实际上有更多的链接引用,如果我们都包括进去,基本上就是SolutionOne的大部分内容)。我知道这意味着当我们打开SolutionTwo时,“C”项目显示未解析到“B”项目的引用,因为它没有包括在我们的第二个解决方案中。
然而:只要我在SolutionTwo之前构建SolutionOne,在Debug配置中,构建就会成功,我们的应用程序也能正常运行。看起来在构建时,Visual Studio足够聪明,可以从SolutionOne构建的位置获取缺少的“B”项目引用的已构建DLL,因为这两个解决方案共享一个根目录。但是,当我尝试在它们的Release配置下构建两个解决方案时,我会得到以下错误:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.targets(316,9): error MSB3104: 未找到引用程序集“[项目路径]\bin\debug\[ProjectReferenceName].dll”。如果这个程序集是由你的其他项目生成的,请确保在构建此项目之前先构建那个项目。
请注意,在该错误消息中,它似乎在正确的bin文件夹中进行探测,但它正在查找/debug子目录而不是/release,尽管两个解决方案都使用它们的发布配置进行构建。
我知道这不是理想的项目/解决方案关系使用方式,但在这个阶段重新组织设计的可能性非常小。有没有办法让Release版本正确地在/bin/release/目录中查找未解析的Project Reference DLL,就像我期望的那样?

相当确定我以前遇到过这个问题,抱歉不记得细节了。如果我没记错,msbuild 有一个Bug/限制,即如果解决方案中不包含项目文件,则 msbuild 将执行某些操作来确定项目引用,并始终查找 Debug 组件,无论指定的构建配置是什么。 - Chris O
@ChrisO,是的,那正好描述了我所看到的。我只是想知道你是否正确地认为这是一个错误(就像我现在所想的一样),或者是否有任何配置行为的方法。谢谢! - Sam Hanley
2个回答

0

请检查您的 C.csproj 文件。

您可能正在通过硬编码路径引用 B.dll,该路径明确引用了 \bin\debug\

编辑:@sphanley:在这种情况下,请检查 B.csproj。验证发布 OutputPath 是否正确设置。类似于:

  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>RELEASE</DefineConstants>
    <Optimize>true</Optimize>
  </PropertyGroup>

引用是项目引用,而不是程序集引用,在.csproj中没有指定路径。这就是为什么这对我来说看起来很奇怪。我认为它应该在调试或发布中找不到,或者在两者中都能找到。 - Sam Hanley

0
请确保您的构建 - 配置管理器的活动解决方案配置设置为“发布”,并且解决方案中每个项目的构建列都有复选标记。

这两件事情都已经得到验证 - 它肯定是使用正确的配置构建相关项目。它只是构建到/bin/release文件夹,然后在/bin/debug中查找DLL。 - Sam Hanley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接