msbuild不会将引用的本机项目的输出复制到c#project out dir
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了msbuild不会将引用的本机项目的输出复制到c#project out dir相关的知识,希望对你有一定的参考价值。
我现在很长时间都在苦苦挣扎。
设置:
- c#项目
- c ++项目
- c#project包含对c ++项目的引用,其中包含以下行:
<ProjectReference Include="projectB.vcxproj"> <ReferenceOutputAssembly>false</ReferenceOutputAssembly> <OutputItemType>Content</OutputItemType> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </ProjectReference>
这与视觉工作室有关。从命令行使用devenv时可以使用此方法。从命令行使用msbuild时 - c ++项目的输出文件不会复制到c#项目的输出目录中。
我无法使用msbuild解决这个问题。阅读了很多关于它,没有任何效果。尝试调试使用diag详细程度 - 但是msbuild和visual-studio的日志非常不同......我不能转向使用devenv,因为构建机器没有有效的visual-studio。
在具有诊断详细程度的msbuild日志中,我看到:Target "GetCopyToOutputDirectoryItems" skipped. Previously built successfully.
这是visual-studio日志中的位置 - 它看起来不同 - 实际上是将引用的本机文件复制到c#输出目录。也许与构建顺序有关的东西?
在msbuild日志中 - 我也看到:Target "_CopyOutOfDateSourceItemsToOutputDirectoryAlways" skipped, due to false condition; ( '@(_SourceItemsToCopyToOutputDirectoryAlways)' != '' ) was evaluated as ( '' != '' ).
在visual-studio构建日志中我看到这个目标已经执行(它来自GetCopyToOutputDirectoryItems目标之后)
更新3:以前的解决方案似乎会导致不必要的副作用,例如在运行多线程构建时破坏构建。
目前似乎有效的解决方案是将<Targets>Build;BuiltProjectOutputGroup</Targets>
添加到ProjectReference
部分。
更新2:
更改:
Targets="%(_MSBuildProjectReferenceExistent.Targets)"
至
Targets="%(_MSBuildProjectReferenceExistent.Targets);GetTargetPath"
在C:Program Files (x86)Microsoft Visual Studio2017ProfessionalMSBuild15.0BinMicrosoft.Common.CurrentVersion.targets
中,在评论Build referenced projects when building from the command line.
之前的MSBuild任务中 - 做了诀窍。
但是,我对此解决方案没有信心,因为我不了解整个构建过程。这只是猜测。
更新1:
使用/p:DesignTimeBuild=true
会影响依赖关系构建顺序。无法工作。继续调查......
可能解决方案1:
把很多消息传递给C:Program Files (x86)Microsoft Visual Studio2017ProfessionalMSBuild15.0BinMicrosoft.Common.CurrentVersion.targets
之后
我终于得到了以下内容:QUIRKING FOR DEV10
我仍然不确定那是什么,我看到开发者计划删除这个怪癖(见https://github.com/Microsoft/msbuild/issues/1890)。
突然,DesignTimeBuild
引起了我的注意:
<Output TaskParameter="TargetOutputs" ItemName="_ResolvedProjectReferencePaths" Condition="'%(_MSBuildProjectReferenceExistent.ReferenceOutputAssembly)'=='true' or '$(DesignTimeBuild)' == 'true'"/>
我知道在视觉工作室内部这项工作。谷歌搜索让我去https://github.com/Microsoft/msbuild/wiki/MSBuild-Tips-&-Tricks。从那里开始,将/p:DesignTimeBuild=true
添加到msbuild命令行的路径很短。
这使它成功了。复制了引用的程序集。
我不认为这应该是解决方案,但它有效,并且似乎没有打破任何其他(尚)。
欢迎任何其他建议。
以上是关于msbuild不会将引用的本机项目的输出复制到c#project out dir的主要内容,如果未能解决你的问题,请参考以下文章
如何使 MSBuild 自动将所有间接引用复制到输出(bin)文件夹
.Net-Core Proj - MSBuild 无法复制到输出文件夹
Visual Studio/MSBuild 将引用的类库的 app.config 作为 *.dll.config 复制到当前项目的 bin 文件夹