何时以及为什么我应该使用.sln文件?

4
我理解一个解决方案文件包含一组其他项目,但我为什么要把一组项目放在单个文件中呢?我工作的公司经常使用此功能,但我看不出为什么要这样做。
另一件我注意到的事情是你可以运行.sln文件,但当文件正在执行时发生了什么?它刚刚做了什么?
所以我的主要问题是,为什么要将多个项目存储在一个.sln文件中,而不是仅在一个项目中完成所有工作?

@PrestonGuillot 哦,好的,我只是指的是在 Visual Studio 中,当我双击一个 .sln 文件时,它会弹出一个加载进度条,所以我觉得肯定有什么事情在进行中,只是不太确定它刚刚做了什么。 - JeremyF
当你有超过1000个项目时,你需要解决a->b->d的问题。你需要确保正确的构建顺序。MSbuild会大部分正确地计算出依赖项。这也使你能够并行编译独立的项目以加快整体编译时间。 - Alois Kraus
1
@AloisKraus 我必须质疑你为什么在一个解决方案中有超过1000个项目。我在现实世界中见过的最多的是97个,那已经很庞大了。(它还有崩溃VS的习惯) - p.s.w.g
是啊...一千个项目听起来像是灾难。我曾经参与过一个完整构建解决方案中有60多个项目的项目,那已经有点吃力了。虽然它能够工作,但是有很多额外的开销。 - neminem
2
是的,这方面存在问题。这些解决方案无法在VS中打开,但msbuild可以很好地编译它们。x86 msbuild可以构建多达500个解决方案,然后由于主要的msbuild在将所有日志发送到TFS之前收集所有日志,因此会耗尽内存。这样的大型解决方案仅适用于大规模并行构建。实际上,我为此目的动态生成它们。 - Alois Kraus
显示剩余4条评论
7个回答

6

为什么您可能希望在一个解决方案中有多个项目:

  • 不同的项目可以有不同的依赖关系(可以是对解决方案中其他项目的依赖,也可以是对第三方dll的依赖)
  • 不同的项目可以是不同的类型-控制台应用程序、dll、Web服务等。
  • 不同的项目可以有不同的预/后构建步骤
  • 您的一些项目甚至可能没有用C#实现。您可以在同一个解决方案中拥有c ++、VB.net等项目。
  • 不同的项目可能是由各种其他团队重复使用的组件。
  • 还有许多其他原因

因此,将多个项目分组是有意义的,这样您就可以打开整个组,在适当的顺序编译所有项目(如果您的某个项目构建了另一个项目需要作为依赖项的dll,则顺序很重要),然后启动您指定的任何项目。

当您打开解决方案时,它只是打开解决方案中包含的每个项目在单个Visual Studio窗口中,以及关于如何编译解决方案的元数据,当您按下运行按钮时应该启动哪个项目等信息。


5
重点是,随着你编写越来越复杂的应用程序,你会发现这些复杂的应用程序需要拆分成多个模块。例如,你可能有一个访问数据库的应用程序。数据库项目可能是独立的。原因是因为你可能想将这个数据库与另一个应用程序一起使用。如果数据层API不是独立的,你就无法做到这一点。
有多个项目的原因有几个:
1. 代码可重用性。你可能设计了一些代码,希望将其打包成库,并在未来与其他程序一起重用。 2. 简单性。有时,在创建复杂的应用程序时,你会想以模块的方式进行架构,以便整体更容易调试。 3. 语言冲突。假设你的应用程序是用C#编写的,但你想使用包含在VB.NET库中的一些代码。由于一个项目不能混合C#和VB.NET代码,所以你的解决方案是在同一个解决方案中创建不同的项目。

1

MSDN的某个摘录中引用

Visual Studio提供了两个容器,帮助您有效地管理开发过程中所需的项目,例如引用、数据连接、文件夹和文件。这些容器称为解决方案和项目。您可以使用“解决方案资源管理器”查看和管理项目和解决方案及其相关项。
解决方案包含创建应用程序所需的项目和文件以及元数据。一个解决方案包括一个或多个项目。当您创建一个新项目时,Visual Studio会自动生成一个解决方案。Visual Studio将解决方案的定义存储在两个文件中:.sln和.suo。解决方案定义文件(.sln)存储定义解决方案的元数据,包括:
- 与解决方案相关联的项目。 - 不与特定项目相关联的项。 - 确定每种构建类型要应用哪些项目配置的构建配置。
随着您构建解决方案并设置其属性,存储在.suo文件中的元数据用于在解决方案处于活动状态时自定义IDE。例如,如果启用该选项,“解决方案资源管理器”为解决方案显示“杂项文件”文件夹,并且适用于解决方案中包含的项目类型的工具从“工具箱”中变得可用。

0

当您双击.sln(解决方案)文件时,它将在Visual Studio中打开该解决方案。

解决方案允许您将项目组合在一个单独的解决方案中。


1
我理解了,但是将项目分组到单个文件中的目的是什么?我何时以及为什么想要这样做呢? - JeremyF
想象一下,如果你有一个n层项目,包括一个网站、一个数据访问层和一个业务逻辑层。你很可能会将它们存储在一个单一的解决方案中。 - ChrisBint
你为什么要将多个源文件组合成一个项目呢? - Preston Guillot

0
但是为什么我想要在一个文件中拥有一组项目呢?
因为您不是一个只学习编程和编写“hello world”应用的爱好程序员。
我的主要项目包含约40个属于一个应用程序的项目。一个shell,多个powershell扩展,多个程序,多个安装程序。它们彼此相关并同时编译 - 它们是一个解决方案。
另一件我注意到的事情是,您可以运行.sln文件,但是执行该文件时会发生什么?
MSBuild根据解决方案中的指令构建项目,还有什么?

当您单击.sln文件时,它不会使用MS Build构建,而是在Visual Studio中打开解决方案。 - ChrisBint
他并没有说“点击它”,而是说“我可以运行”。我把它作为msbuild输入 ;) - TomTom

0

将项目组合在一个解决方案中更容易,因为每当您打开解决方案时,运行该项目所需的所有文件也会被打开。

这还使得为程序的一个部分创建一个“解决方案”,然后将该解决方案添加到包含整个程序的主解决方案中变得更加容易。这使得对代码进行分区变得容易,并且知道哪些部分依赖于其他部分。

您以前使用什么方法来组织您的项目?


0
这是一个具体的例子:
如果你将一些逻辑从你的项目中分离出来,制作成一个可重用的库,那么这就是第二个项目(类库),你可以通过名称从第一个项目中引用它们,如果它们包含在同一个解决方案中。当你运行你的项目时,Visual Studio会自动根据需要重新构建第二个项目。

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