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

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

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

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

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

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

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

各プロジェクトのファイルには、そのプロジェクトの項目を階層に設定するために環境によって読み取られる追加情報が含まれています。 階層データの永続化は、プロジェクトによって制御されます。 通常、データはファイルに .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 読み取り、マーク preSolutionされたすべてのセクションを処理します。 このサンプル ファイルには、次のようなステートメントが 1 つあります。

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

    環境は、GlobalSection('name') タグを読み取ると、レジストリを使用して名前を VSPackage にマップします。 キー名は、レジストリの下 [HKLM\\<Application ID Registry Root\>\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環境によって呼び出されます。

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

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

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