如何将多个visual studio解决方案链接在一起?

时间:2009-03-25 14:59:39

标签: visual-studio projects-and-solutions

我有3个解决方案和解决方案A需要从解决方案B和C构建的dll版本才能进行编译。无法将其合并到一个解决方案......

到目前为止,似乎Visual Studio不支持解决方案引用,并且msbuild非常聪明,知道如果我尝试这种方式,您正在构建另一个解决方案。总体目标是尝试使多个解决方案看起来几乎只有一个 - 只是解决方案A。

我相信这是一个常见的问题,但你怎么把它很好地联系起来呢?

9 个答案:

答案 0 :(得分:29)

此问题已在different中弹出,但related表格。实际上有一个MSDN page that covers this

您正在寻找的是一种多解决方案,类似于针对较大系统的分区单一解决方案模型。有一个“一切”解决方案,可以构建所有内容并维护组件间的依赖关系。这是您在构建解决方案A时构建的内容。然后,您将拥有仅包含组件B或C的单独解决方案。实际上,您仍将拥有3个解决方案,但您可以将解决方案B和C中的项目添加到解决方案中甲

答案 1 :(得分:4)

我最近发现,在Visual Studio 2008中,您可以在多个解决方案中包含现有项目。到目前为止唯一的缺点似乎是,如果您对共享项目进行更改并打开多个使用该共享项目的解决方案,则会要求您“重新加载”其他解决方案。

因此,只需将“添加现有项目”添加到需要该项目的所有解决方案中。我在我当前的网站上使用TFS,源控制以太似乎没有问题。

答案 2 :(得分:3)

它应该是你所看到的项目级别我相信。构建解决方案B和C中包含的项目,然后在解决方案A中的相关项目中添加对DLL的引用。

如果你有一个属性组,那么在Msbuild中

<PropertyGroup>

<SolutionsToBuild>SolutionB</SolutionsToBuild>
<SolutionsToBuild>SolutionC</SolutionsToBuild>
<SolutionsToBuild>SolutionA</SolutionsToBuild>
</PropertyGroup>

然后执行MSBuild任务

<MSBuild Projects="@(SolutionsToBuild)"/>

希望这有帮助

答案 3 :(得分:1)

您可以尝试自动执行合并过程以节省一些时间: http://code.google.com/p/merge-solutions/

虽然我们的问题略有不同:大约有15个解决方案(总共约150个项目)正在使用一个公共库。问题在于,如果我们尝试将所有这些合并为一个,以便从公共库重构/消除冗余代码。 合并15个解决方案需要在VS中进行大量点击和等待 2.结果解决方案永远不会更新 - 没有人因为它的大小而烦恼更新它

答案 4 :(得分:0)

您可以尝试为项目的预建事件中依赖的dll(在解决方案B和C中)添加命令行构建命令(在解决方案A中)

答案 5 :(得分:0)

如果你不能将项目B和C放在与项目A相同的解决方案中,那么在构建项目A时,无法确保包含最新源代码的B和C的二进制文件。

我见过的最简单的解决方案是在源代码存储库中有一个公共文件夹,如果需要共享,每个项目都会复制其二进制文件。然后,只要您的本地文件夹看起来与存储库相同,所有其他项目都可以引用该文件夹中的二进制文件。

不是一个完美的解决方案,但它很容易使用。

答案 6 :(得分:0)

您可以将Makefile项目添加到解决方案A,该解决方案将构建您的解决方案B和C(例如使用msbuild)并使A中的所有项目依赖于该Makefile项目。这样您就无法向B和C中的项目添加项目引用,但您可以使用dll引用,它们将始终从最新源构建。

答案 7 :(得分:0)

根据this answer,我建议您创建自己的批处理文件,这将为您构建相关的解决方案。

使用起来非常方便,因为构建过程会将构建进程(类似于Visual Studio中的“输出”窗口)输出到命令提升,以便执行每个构建。

此外,如果您需要在另一个之前构建一个解决方案,您可以编写自己的构建顺序,例如:

  1. 构建解决方案B
  2. 构建解决方案C
  3. 构建解决方案A(内部使用“解决方案B”和“解决方案C”构建文件)
  4. 我很快写了script to clarify the build order mentioned above并支持大多数现代Visual Studio版本。

    问候。

答案 8 :(得分:0)

我通过将脚本放入构建前事件命令行中以及如果项目A无法构建引发msg警报来解决此问题

ECHO "build A project"
set AppMsg ="%SystemRoot%\System32\msg.exe"
set AppMsg
if not "%ProgramFiles(x86)%" == "" (
if exist "%SystemRoot%\Sysnative\*" set AppMsg="%SystemRoot%\Sysnative\msg.exe"
)
set AppMsg
taskkill /f /im "%PROGRAMFILES(X86)%\MSBuild\14.0\Bin\msbuild" "$(SolutionPath)" /t:Project_A_Name /p:Configuration=Debug;TargetFrameworkVersion=v4.5 /p:Platform="Any CPU" /p:BuildProjectReferences=false /p:VSToolsPath="%PROGRAMFILES(X86)%\MSBuild\Microsoft\VisualStudio\v14.0" 2>nul 1>nul
echo ERRORLEVEL %ERRORLEVEL%
if ERRORLEVEL 1 (
ECHO "failed to build test project"
%AppMsg% * "failed to build test project"
)
exit 0