为什么会有.sln、.suo和.csproj文件?

63
我开始使用Visual Studio 2010。完成C#程序后,我发现在项目根目录下有 .sln.suo 文件,在子目录中有一个 .csproj 文件,它们是用来干什么的?
我需要确定哪些文件要放入Git库。除了我创建的源代码/文档外,我猜这三个文件是我要关心的唯一文件。但我不确定我是否跟踪了正确的文件。

补充

那个个人宏文件怎么样? 我有 Emacs键切换宏.sln文件或.csproj文件是否包含此宏?

5个回答

75
你应该提交.sln.csproj,但不要提交.suo.user文件。

你可以将以下内容添加到.gitignore中:

#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.obj
*.exe
*.pdb
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.lib
*.sbr
obj/
[Rr]elease*/
_ReSharper*/
[Tt]est[Rr]esult*

5
如果您想共享调试/命令行参数,那么将 .user 文件放入版本控制是非常有用的。 - Tim
6
@Tim:我不同意 - 默认情况下,.user文件将注册完全限定的路径,这些路径通常在开发人员之间无效。但是,您可以通过将相关行从.user文件复制到.csproj文件中,在.csproj文件中注册共享调试设置。 - Jean Hominal
2
我没有意识到那些是完整路径。那很不幸。微软在那里肯定搞砸了。你的解决方案更好。我赞同了你的评论。 - Tim
重要提示:除非在第一行添加“syntax: glob”,否则此操作将无法正常工作! - DJMcMayhem
2
这个答案只是提供了一个“什么”,没有提供任何理解或“为什么”。 - Orangutech

44

SLN(解决方案)是解决方案文件。它存储关于开发内容所包含的项目集合的信息。它们包含项目、源代码控制设置或任何其他全局级别的事物。

CSProj(项目文件)是实际的代码项目(C# 库,WCF 服务等)。它在项目级别存储信息,并包装所有相关引用、类等。

SUO(解决方案用户选项)是用户设置文件。这些文件完全可以丢弃,你可以将其删除,最常见的遗失是断点。


推送除 SUO 设置文件外的所有内容。

不要包含任何 bin、debug、obj 目录。唯一应包含的 DLL(或编译/生成的对象)是那些与您的应用程序外部相关的。


1
“.sln”文件包含开发人员特定的信息,例如它们正在运行的Visual Studio版本。有可能避免提交这些信息吗?否则,每当不同版本的开发人员提交某些内容时,我们就会得到噪音差异。 - Jean Jordaan

15

来自MSDN:

解决方案(.sln)是在Visual Studio中组织项目的结构。它执行类似于Visual Basic 6.0中的Windows程序组(.vbg)文件和Visual C++ 6.0中的项目工作区(.dsw)文件的功能。该解决方案在.sln(基于文本,共享)和.suo(二进制,特定用户解决方案选项)文件中维护项目的状态信息...[来源]

此外,还来自MSDN:

解决方案用户选项(.suo)文件是以二进制格式存储的结构化存储或复合文件。您可以将用户信息保存到名称为流的流中,该流的名称是用于在.suo文件中标识信息的键... [来源]

您不需要将.suo文件放入版本控制系统(VCS)。这是一个特定用户的文件。


3
SUO文件确实有其用途,我不同意忽视它们的说法。通常情况下,我会将它们添加到我们的SVN代码库中。我的项目并不总是使用解决方案默认的启动项目或平台设置。如果我获取一个新项目,它不会默认为64位和正确的平台,这让我感到很烦。SUO包含了设置这些默认值的设置。
但是这样做的缺点是SUO文件是二进制文件,所以几乎每次打开解决方案并进行任何操作时,文件都会被更改。通常情况下,该文件小于100k,并且除非您知道您更改了什么,否则我不会提交更改。

3
补充一下评论。如果你和1个以上的人一起工作,你需要小心。在团队合作中,需要确保有一个初始版本被检查以获取所需的默认值,但作为开发者,我从不检查我的版本。 - Brian S

0
在我的情况下,我删除了解决方案和项目中所有的“bin”和“obj”文件夹。

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