我现在很长时间都在挣扎。
设置:
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目标之后出现)
答案 0 :(得分:1)
更新3: 以前的解决方案似乎会导致不必要的副作用,例如在运行多线程构建时破坏构建。
当前的解决方案似乎有效,是添加:
<Targets>Build;BuiltProjectOutputGroup</Targets>
到ProjectReference
部分。
更新2:
更改:
Targets="%(_MSBuildProjectReferenceExistent.Targets)"
到
Targets="%(_MSBuildProjectReferenceExistent.Targets);GetTargetPath"
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets
中的,在注释Build referenced projects when building from the command line.
之前的MSBuild任务中 - 完成了这一操作。
但是,我对此解决方案没有信心,因为我不了解整个构建过程。这只是猜测。
更新1:
使用/p:DesignTimeBuild=true
会影响依赖关系构建顺序。无法工作。继续调查......
可能的解决方案1:
将大量留言放入C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\Microsoft.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命令行的路径很短。
这使它成功了。引用的程序集已复制过来。
我不认为这应该是解决方案,但它有效,并且似乎没有打破任何其他(还)。
欢迎任何其他建议。