MSBuild不会获取引用项目的引用

时间:2008-09-26 01:14:28

标签: msbuild build-automation dependencies

我刚刚在MSBuild遇到了一个奇怪的情况。有一个解决方案有三个项目:LibX,LibY和Exe。 exe引用LibX。 LibX反过来引用了LibY,有一些内容文件,还引用了第三方库(在GAC和本地lib文件夹中安装了几个预构建的程序集)。第三方库被标记为“复制本地”(“私有”)并出现在LibX项目的输出中,如LibY的输出和LibX的内容文件那样。现在,Exe项目的输出有LibX项目输出,LibX项目的内容文件,LibY项目输出(来自LibX),但没有第三方库的程序集。

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

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

6 个答案:

答案 0 :(得分:12)

与使用Visual Studio构建相比,使用MSBuild(即命令行,TFS构建和其他工具)构建时的行为存在差异。辅助引用不包含在发送到MSBuild编译任务的引用变量中。

MSBuild提供了几个扩展点来更改引用的解析方式。我已成功使用AfterResolveReference来解决我的一些项目问题 - I have posted more info about the background on my blog

解决方法是将以下代码添加到vbproj或csproj文件

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

Microsoft已声明此问题无法修复Connect

答案 1 :(得分: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中找到它的唯一方法。

答案 2 :(得分:3)

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

答案 3 :(得分:3)

约瑟夫的回答几乎对我有用;我尝试这样做时,我在Visual Studio中遇到错误:

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

我的问题的解决方案是在ItemGroup上添加一个条件,如下所示:

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

这导致Visual Studio完全忽略引用更改,并且构建在本地和构建服务器上正常工作。

答案 4 :(得分:2)

我将Alex Yakunin的solutionalso copy native dll's合并。{/ p>

答案 5 :(得分:0)

如果您的有向图不是具有“尝试部署dll的不同副本”错误的树,则AfterResolveReferences方法将失败。 (参见How to configure msbuild/MSVC to deploy dependent files of dependent assemblies