ソリューション (.sln) ファイル

適用対象:yesVisual Studio noVisual Studio for Mac noVisual Studio Code

ソリューションは、Visual Studio でプロジェクトを整理するための構造です。 ソリューションでは、プロジェクトの状態情報が次の 2 つのファイルに保持されます。

  • .sln ファイル (テキストベース、共有)

  • .suo ファイル (バイナリ、ユーザー固有のソリューション オプション)

.suo ファイルの詳細については、「 ソリューション ユーザー オプション (.suo) ファイル」を参照してください。

.sln ファイルで参照されているために VSPackage が読み込まれた場合、環境は .sln ファイルで読み取りを呼び出します ReadSolutionProps

.sln ファイルにはテキストベースの情報が含まれており、環境ではこれを使用して、永続化されたデータの名前と値のパラメーター、および参照されているプロジェクト VSPackage の検索と読み込みを行います。 ユーザーがソリューションを開くと、環境では.sln ファイル内の preSolutionProject、および postSolution の情報が順番に処理され、ソリューション、ソリューション内のプロジェクト、およびソリューションに関連付けられている永続化された情報が読み込まれます。

各プロジェクトのファイルには、そのプロジェクトの項目を階層に設定するために環境によって読み取られる追加情報が含まれています。 階層データの永続化は、プロジェクトによって制御されます。 通常、データは .sln ファイルに格納されませんが、これを選択した場合は、プロジェクト情報を .sln ファイルに意図的に書き込むことができます。 永続化の詳細については、「プロジェクトの永続化」および「プロジェクト項目のオープンと保存」を参照してください。

ファイル ヘッダー

.sln* ファイルのヘッダーは次のようになります。

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.28701.123
MinimumVisualStudioVersion = 10.0.40219.1
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.2.32505.173
MinimumVisualStudioVersion = 10.0.40219.1

定義

Microsoft Visual Studio Solution File, Format Version 12.00
ファイル形式のバージョンを定義する標準ヘッダー。

# Visual Studio Version 16
このソリューション ファイルを (最後に) 保存した Visual Studio のメジャー バージョン。 この情報は、ソリューション アイコンのバージョン番号を制御します。

VisualStudioVersion = 16.0.28701.123
このソリューション ファイルを (最後に) 保存した Visual Studio のフル バージョン。 ソリューション ファイルが、同じメジャー バージョンの新しいバージョンの Visual Studio によって保存されている場合。 この値は、ファイル内のチャーンを減らすように更新されません。

MinimumVisualStudioVersion = 10.0.40219.1
このソリューション ファイルを開くことができる Visual Studio の最小 (最も古い) バージョン。

Microsoft Visual Studio Solution File, Format Version 12.00
ファイル形式のバージョンを定義する標準ヘッダー。

# Visual Studio Version 17
このソリューション ファイルを (最後に) 保存した Visual Studio のメジャー バージョン。 この情報は、ソリューション アイコンのバージョン番号を制御します。

VisualStudioVersion = 17.2.32505.173
このソリューション ファイルを (最後に) 保存した Visual Studio のフル バージョン。 ソリューション ファイルが、同じメジャー バージョンの新しいバージョンの Visual Studio によって保存されている場合。 この値は、ファイル内のチャーンを減らすように更新されません。

MinimumVisualStudioVersion = 10.0.40219.1
このソリューション ファイルを開くことができる Visual Studio の最小 (最も古い) バージョン。

ファイルの本文

.sln ファイルの本文は、次のように、GlobalSection というラベルの付いたいくつかのセクションで構成されています。

Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Project1", "Project1.vbproj", "{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}"
EndProject
Global
  GlobalSection(SolutionNotes) = postSolution
  EndGlobalSection
  GlobalSection(SolutionConfiguration) = preSolution
       ConfigName.0 = Debug
       ConfigName.1 = Release
  EndGlobalSection
  GlobalSection(ProjectDependencies) = postSolution
  EndGlobalSection
  GlobalSection(ProjectConfiguration) = postSolution
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Debug.ActiveCfg = Debug|x86
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Debug.Build.0 = Debug|x86
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Release.ActiveCfg = Release|x86
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Release.Build.0 = Release|x86
  EndGlobalSection
  GlobalSection(ExtensibilityGlobals) = postSolution
  EndGlobalSection
  GlobalSection(ExtensibilityAddIns) = postSolution
  EndGlobalSection
EndGlobal

ソリューションを読み込むには、環境で次の一連のタスクが実行されます。

  1. 環境は、.sln ファイルの Global セクションを読み取り、preSolution とマークされているすべてのセクションを処理します。 この例のファイルには、次のようなステートメントが 1 つあります。

    GlobalSection(SolutionConfiguration) = preSolution
         ConfigName.0 = Debug
         ConfigName.1 = Release
    

    環境は、GlobalSection('name') タグを読み取ると、レジストリを使用して名前を VSPackage にマップします。 キー名は、レジストリの [HKLM\<アプリケーション ID レジストリ ルート>\SolutionPersistence\AggregateGUIDs] の下に存在する必要があります。 キーの既定値は、エントリを書き込んだ VSPackage のパッケージ GUID (REG_SZ) です。

  2. 環境は、VSPackage を読み込み、VSPackage に対して QueryInterface を呼び出して IVsPersistSolutionProps インターフェイスを取得し、セクションのデータを使用して ReadSolutionProps メソッドを呼び出すことで、VSPackage でデータを格納できるようにします。 環境は、各 preSolution セクションについてこのプロセスを繰り返します。

  3. 環境は、プロジェクトの永続化ブロックを反復処理します。 この場合、1 つのプロジェクトがあります。

    Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Project1",
    "Project1.vbproj", "{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}"
    EndProject
    

    このステートメントには、一意のプロジェクト GUID とプロジェクト タイプの GUID が含まれています。 この情報は、ソリューションに属するプロジェクトファイル、および各プロジェクトに必要な VSPackage を検索するために、環境によって使用されます。 プロジェクトに関連する特定の VSPackage を読み込むためにプロジェクト GUID が IVsProjectFactory に渡され、その後、プロジェクトが VSPackage によって読み込まれます。 この例では、このプロジェクトのために読み込まれる VSPackage は Visual Basic です。

    各プロジェクトは、必要に応じてソリューション内の他のプロジェクトからアクセス可能になるように、一意のプロジェクト インスタンス ID を永続化することができます。 理想的には、ソリューションとプロジェクトがソース コード管理下にある場合、プロジェクトへのパスはソリューションのパスに対する相対パスである必要があります。 ソリューションが最初に読み込まれると、プロジェクト ファイルをユーザーのコンピューターに置くことができません。 ソリューション ファイルを基準としてサーバーに格納されているプロジェクト ファイルを使用すると、プロジェクト ファイルが見つかり、ユーザーのコンピューターにコピーされる方が比較的簡単になります。 その後、プロジェクトに必要な残りのファイルがコピーされて読み込まれます。

  4. .sln ファイルのプロジェクト セクションに格納されている情報に基づいて、環境は各プロジェクトファイルを読み込みます。 その後、プロジェクト自体によって、プロジェクト階層の設定および入れ子になったプロジェクトの読み込みが行われます。

  5. .sln ファイルのすべてのセクションが処理されると、ソリューションがソリューション エクスプローラーに表示され、ユーザーが変更できるようになります。

VSPackage を実装するソリューション内のプロジェクトが読み込みに失敗した場合、メソッドが呼び出され、 OnProjectLoadFailure ソリューション内のすべてのプロジェクトが読み込み中に行った可能性のある変更は無視されます。 解析エラーの場合は、可能な限り多くの情報がソリューション ファイルと共に保持されます。 ソリューションが破損していることをユーザーに警告するダイアログ ボックスが表示されます。

ソリューションを保存または閉じると、 QuerySaveSolutionProps メソッドが呼び出されます。 階層に渡され、.sln ファイルに入力する必要があるソリューションに変更が加えられているかどうかを確認します。 QuerySaveSolutionPropsVSQUERYSAVESLNPROPS で null 値が渡された場合は、 ソリューションの情報が永続化されることを示します。 値が null でない場合、永続化される情報は、インターフェイスへのポインターによって決定される特定のプロジェクト用 IVsHierarchy です。

保存する情報がある場合は、 IVsSolutionPersistence メソッドへのポインターを使用してインターフェイスが SaveSolutionProps 呼び出されます。 次に、環境は WriteSolutionProps メソッドを呼び出して IPropertyBag インターフェイスから名前と値のペアを取得し、情報を .sln ファイルに書き込みます。

すべての変更が .sln ファイルに入力されるまで、環境は SaveSolutionProps オブジェクトと WriteSolutionProps オブジェクトを再帰的に呼び出して、保存すべき情報を IPropertyBag インターフェイスから取得します。 この方法では、情報がソリューションと共に保持され、次にソリューションを開いた時点で使用できることを確認できます。

読み込まれた各 VSPackage について、.sln ファイルに保存すべき情報があるかどうかが確認されます。 レジストリ キーのクエリが実行されるのは、読み込み時のみです。 環境では、読み込まれたすべてのパッケージが認識されています。これらは、ソリューションが保存されるときにメモリ内にあるためです。

preSolution セクションと postSolution セクションにエントリが含まれているのは .sln ファイルだけです。 この情報はソリューションの正しい読み込みに必要なので、.suo ファイルには類似のセクションはありません。 .suo ファイルには、共有またはソース コード管理下に配置することを意図していないプライベート ノートなどのユーザー固有のオプションが含まれています。

関連項目