强制Visual Studio重新构建依赖项目

8
我该如何强制Visual Studio 2012在项目更改时重新构建所有依赖项?
我有两个项目:一个C++ DLL和一个C# WPF应用程序。 C# 项目有一个后置构建命令,将DLL复制到Debug文件夹中。
当我修改C++项目时,DLL被重新构建,但是C#项目没有被重新构建,因此DLL没有在Debug文件夹中更新。然后我需要清理并重新构建解决方案,才能看到更新的结果。
我想告诉VS,每当我更新C++项目时,它应该重新构建C#项目(或至少运行后置构建命令)。C#项目依赖于C++项目,但不通过引用进行。

你尝试过简单地设置项目依赖吗? - Cheers and hth. - Alf
@Cheersandhth.-Alf 是的,这些都已经设置好了。 - Kendall Frey
丑陋的,但也许可以在C++项目中添加一个后构建步骤,touch-es C#项目中的一个文件。如果您的机器上没有touch工具,则可以使用nmake中的一个(穷人版的touch)。 - Cheers and hth. - Alf
1
@Cheersandhth.-Alf,问题是C++项目与C#项目是独立的。C#项目是许多应用程序之一,可以使用该DLL。 - Kendall Frey
非常好的问题。我现在正好遇到了同样的问题,一个C#项目在语义上依赖于一个C++、Win32项目。它无法直接"引用"它,因为这是一个.exe文件,会在构建后被复制。 - Per Lundberg
显示剩余8条评论
3个回答

5
为了补充Peter的答案,这是我所做的。
在解决方案资源管理器中右键单击C#项目,然后选择添加>现有项。
浏览到C++输出文件夹,选择DLL文件,而不是使用添加按钮打开它,点击旁边的下拉按钮,然后选择添加为链接。
接下来我最初所做的是右键单击添加到C#项目的链接,选择属性,然后将复制到输出目录更改为仅在更新时复制。但后来我意识到这将复制Debug版本(因为链接指向的就是那里),而不是当前配置。因此,我将其保留为不复制,因为我的命令行会自动选择正确的配置。
因此,现在C#项目具有对C++项目输出的链接,每当C++项目更改时都会触发重建,即使该链接与项目输出无关。
记录一下,这是我的C#项目中的后期构建命令行(foobar是C++ DLL)。
copy "$(SolutionDir)\$(Configuration)\foobar.dll" "$(TargetDir)"

1
这个可以运行,但如果你添加了Debug版本的链接,它只会在Debug配置激活时运行。为了使其在Debug和Release中都能工作,你需要添加两个链接。 - Per Lundberg
我该如何强制构建C++ dll? - rollsch

3
如果在你的解决方案中设置项目依赖没有帮助,只需尝试将C++项目中的.dll文件作为链接包含到其他项目中,然后它应该能够识别到文件已更改并重新构建项目。

2
将C++项目中的.dll文件作为链接包含到另一个项目中。这究竟是什么意思? - Kendall Frey
@KendallFrey 我认为这意味着将dll作为“解决方案项”添加到C#项目中。 - phoog
@phoog 这甚至更没有意义。 - Kendall Frey
一个(荒谬的)方法是添加所有四个组合(Debug/x86,Debug/x64,Release/x86 和 Release/x64)。我现在会这样做,但是真的,真的感觉很疯狂。 :) - Per Lundberg
2
您可以在文本编辑器中手动编辑项目文件,并修改链接以使用 $(Configuration) 和 $(Platform) 变量,从而只需要一个链接。 - Lummo
显示剩余2条评论

1

将以下代码插入每个依赖项目中:

<ItemGroup>
    <None Include="$(MSBuildProjectDirectory)\Properties\Build\_buildforcer">
        <Visible>true</Visible>
    </None>
</ItemGroup>
<Target Name="ForceNextBuild"
        AfterTargets="PrepareForRun"
        Condition=" '$(BuildingInsideVisualStudio)' == 'true' ">

    <Touch Files="$(MSBuildProjectDirectory)\Properties\Build\_buildforcer"
           AlwaysCreate="true"/>
</Target>

如果需要的话,您可以通过导入来实现此操作。这将强制项目始终进行构建,而不仅仅是在其依赖项更改时。

但是,这些依赖项目通常是应用程序项目,它们通常是业务库的薄包装器。此外,这种方式并不会强制编译。只有MSBuild执行所有目标才能发现一切都是最新的。因此,您的F5性能不会受到很大影响。

我已经明确将None项目标记为Visible,因为该项目必须对此机制可见才能正常工作。另外,请注意,在进行以上更改后,您可能需要重新加载解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接