MSBuild无法获取已引用项目的引用

14

我刚刚在使用MSBuild时遇到了一个奇怪的情况。有一个包含三个项目(LibX、LibY和Exe)的解决方案。Exe引用了LibX,而LibX又引用了LibY,并且包含一些内容文件以及对第三方库的引用(该库的多个预构建程序集已安装在GAC和本地lib文件夹中)。该第三方库被标记为“Copy Local”(“私有”),并且出现在LibX项目的输出中,以及LibY的输出和LibX的内容文件中。现在,Exe项目的输出包括了LibX项目输出、LibX项目的内容文件、来自LibX的LibY项目输出,但是没有第三方库的程序集。

目前,我通过直接在Exe项目中引用第三方库来解决这个问题,但我不认为这是一个“正确”的解决方案。

有人之前遇到过这个问题吗?


有没有完整的源代码示例,可以作为最终解决方案? - Kiquenet
6个回答

13

使用MSBuild(即命令行、TFS Build和其他工具)构建与使用Visual Studio构建时行为存在差异。次要引用未包含在发送到MSBuild编译任务的引用变量中。

MSBuild提供了几个扩展点来更改引用解析方式。我已成功使用AfterResolveReference为我的一些项目解决了这个问题 - 我在我的博客上发布了更多相关信息

解决方法是在您的vbproj或csproj文件中添加以下代码:

  <Target Name="AfterResolveReferences">
    <!-- Redefine referencepath to add dependencyies-->
    <ItemGroup>
     <ReferencePath Include="@(ReferenceDependencyPaths)">
     </ReferencePath>
    </ItemGroup> 
  </Target>

微软已经在Connect上表示这是不会修复的。


很好。这实际上是问题的更好解决方案。 - Fabricio

4
您可以进入Microsoft.CSharp.targets或Microsoft.VisualBasic.targets文件(位于框架目录中,通常为C:\ Windows \ Microsoft.NET \ Framework \ v3.5),并修改csc或vbc任务参数以包括其他引用依赖项。在文件中(VB目标,第166行; C#目标,第164行)更改:
References="@(ReferencePath)"

为了

References="@(ReferencePath);@(ReferenceDependencyPaths)"

这可能会导致其他问题,具体取决于事情的复杂程度,并且可能会与Visual Studio inproc编译器玩一些把戏,但这是我在MSBuild中发现的唯一方法。


一开始这对我没有任何影响,但后来我发现(至少在Framework\v4.0.30319中)每个.targets文件中该行出现了两次。 - CoderDennis

3

josant的回答对我来说几乎起了作用;当我尝试时,我在Visual Studio中一直收到错误:

尝试设置IDE的进程内编译器的“引用”参数时出现问题。 从调用COM组件返回了错误HRESULT E_FAIL

解决我的问题的方法是在ItemGroup上加一个条件,就像这样:

<Target Name="AfterResolveReferences">
  <!-- Redefine referencepath to add dependencies-->
  <ItemGroup Condition=" '$(BuildingInsideVisualStudio)' != 'true' ">
    <ReferencePath Include="@(ReferenceDependencyPaths)"></ReferencePath>
  </ItemGroup>
</Target>

那导致 Visual Studio 完全忽略了引用更改,但本地构建和构建服务器上的构建都可以正常工作。

2

2

是的,我也遇到过这个问题。虽然我很想说不用这么做,但我认为你必须在构建文件中将所有传递依赖项作为引用包含。


0

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