我刚才碰到了与MSBuild的一个奇怪的现象。 有这三个项目的解决方案:libx中,立白和EXE。 exe文件引用了libx。 libx中反过来引用立白,有一些内容文件,并且还引用第三方库(同时安装在GAC和地方lib文件夹几个预建的组件)。 第三方库被标记为“复制本地”(“私人”),并出现在了libx项目的输出,作为立白的产量和libx中的内容文件执行。 现在,EXE项目的输出具有libx中的项目输出,在libx中的项目的内容的文件,立白项目输出(从libx中推出),但没有第三方库的组件。
现在,我直接在Exe项目引用第三方库工作这么身边,但我不觉得这是一个“正确”的解决方案。
任何人有过这个问题吗?
是的,我有这个问题了。 虽然我很想否则说了,我相信你必须包括所有传递依赖作为构建文件的引用。
有伴的MSBuild的建设(即命令行,TFS建立和其他工具)相比,使用Visual Studio生成时是行为上的差异。 二级引用不包括在发送到的MSBuild编译任务的引用变量。
有通过的MSBuild提供改变引用是如何解决的几个扩展点。 我已经成功地使用AfterResolveReference来解决这个问题,我的一些项目- 我已经张贴了关于我的博客的背景更多信息 。
解决办法是进入你vbproj或的csproj文件添加以下代码
<Target Name="AfterResolveReferences">
<!-- Redefine referencepath to add dependencyies-->
<ItemGroup>
<ReferencePath Include="@(ReferenceDependencyPaths)">
</ReferencePath>
</ItemGroup>
</Target>
微软曾表示,这是一个不会在修复连接
实际上,你可以进入Microsoft.CSharp.targets或Microsoft.VisualBasic.targets文件(位于框架目录,通常为C:\ WINDOWS \ Microsoft.NET \框架\ v3.5版本),并修改CSC或VBC任务参数包括附加的参考依赖关系。 在文件(VB目标,线166; C#目标,线164)的变化:\
References="@(ReferencePath)"
至
References="@(ReferencePath);@(ReferenceDependencyPaths)"
这可能会导致其他问题,取决于如何复杂的事情是,它可以与Visual Studio编译器进程内做手脚,但它是这样做的MSBuild的唯一办法,我已经找到。
josant的回答几乎是为我工作; 我一直得到一个错误在Visual Studio时,我试过了:
尝试设置为IDE的进程编译“参考”参数时出现问题。 错误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来完全忽略参考变化,并构建工作正常本地和构建服务器上。
我结合亚历克斯亚库宁的解决方案有一个会也复制原生的DLL 。
如果你有一个有向图不能用“尝试部署的DLL的不同副本”错误树AfterResolveReferences方法失败。 (参见如何的MSBuild / MSVC配置部署相关组件的相关文件 )