Visual Studioで新しくプロジェクトを作る時に入力する名前とソリューション名の違いってなんだろう

普段あまり意識しないけど、ブログを書くにあたって、どう違うのか説明してみようと思ったので書きます。

違いがわかるようにプロジェクトを作成する。

名前はプロジェクト名だったり、フォルダ名だったり、ネームスペースに使われる。
ソリューション名は、その名の通り、ソリューションの名前とルートフォルダの名前となる。

これだけでわかる人はいいけど、わからない人も多いと思う。
っということで、画像で違いを確認していきます。

まず、違いを確認するために新しいプロジェクトを作成する。
そこで、以下のように名前とソリューション名を区別してプロジェクトを作成する。
名前をHelloWorldとして、ソリューション名をHelloWorld2とする。


画像1

違いを確認していく

VisualStudioのソリューションエクスプローラーから確認

まず、名前がどこで使われているかというと、以下の部分。
自動的に作成されたフォルダやファイルで、一番上の名称がHelloWorldとなっている。
これはプロジェクト名ですね。


画像2

作成されたフォルダから確認

次に、プロジェクトを保存しているフォルダーに移動すると、ルートフォルダにHelloWorld2という名前がついている。
プロジェクトの中身を格納するフォルダーがプロジェクト名となっている。
また、拡張子が「sln」ソリューションとなっている。


画像3

プロジェクトの中身を格納しているのがHelloWorldなので、そこの中を見てみる。
中にはHelloWorld.csprojというファイルや、いくつかのフォルダがあります。


画像4

とりあえず、名前がどこで使われているのかというのは、これでわかったかと思います。
仕事で開発していても、一からプロジェクトを作ってという機会は少ないので、意外と盲点だったりするかもしれません。

そもそもソリューションとプロジェクトの違いって何よ

プロジェクトの作成で入力した名前やソリューション名が、どこに反映されるのかというのはわかりました。
しかし、これらにどんな関係があるのかというのはイマイチわからないかもしれません。

っというのも、ここまでの内容ではプロジェクトとは何か,ソリューションとは何かを説明していないからです。
簡単にそれぞれを説明すると
ソリューションは、一つ以上のプロジェクトを含んだ入れ物というようなイメージです。
アプリを開発するとき、一つのプロジェクトですべてを完結させてしまうこともできます。
HelloWorldとかだと、まさに一つのプロジェクトにぴったりな小ささです。
ただ、普通は複数のプロジェクトを組み合わせて開発していくことになります。
なぜ複数のプロジェクトでアプリを開発するのかというと、プロジェクトを処理の単位として管理したり、
以前に作ったものを再利用したりするのに便利だからです。


画像5

上記イメージのように、ソリューションは一つ以上のプロジェクトを含むものです。
私は以前、ソリューション(sln)はダブルクリックして開発をスタートさせるもの程度にしか認識していませんでした。
しかし、これは複数のプロジェクトの塊であり、ビルドの順序やイベント等を管理するファイルということを知りました。
っというわけで、ここからは違うプロジェクトを追加して、なんかそれっぽい構成にしてみます。(っといっても、一つ追加するだけ)
最初の時と同じように、新しいプロジェクトをメニューから作成してみます。
ただし、今回は以下のようにソリューションという選択肢があることがわかります。
ここでソリューションに追加するを選びます。すると、このソリューションの持ち物としてプロジェクトが作成されます。


画像6


画像7

このように、複雑な開発をプロジェクトの単位で分割したり、他から持ってきたプロジェクトをパーツのようなイメージで組み合わせたりできます。

脱線:csprojって何

csと書いてある通り、C#におけるプロジェクトファイルに付く拡張子のことです。
ビルド時に必要となる情報が書かれています。
csprojをメモ帳かなにかで開いて、中身を確認してみましょう。

中身はXMLで記述されています。
よく見てみると、タグの名前から予想できるかもしれません。
ターゲットフレームワークとか、パッケージの参照関係が記述されています。
Visual Studioでクラスを追加したりすると自動的に書き変わります。

<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" PrivateAssets="All" />
</ItemGroup>

</Project>

C#

Posted by takumioda