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 文件夹

MSBuild:如何将文件复制到由执行命令的输出确定的 DestinationFolder?

MSBuild 复制动态生成的文件作为项目依赖项的一部分

SBT 本机打包程序不会将文件复制到 Docker 映像