Visual Studio 2022で既存のフォルダー階層を取り込む方法は、プロジェクトの種類で変わります。C++のvcxproj、従来のC#、SDK形式のC#、CMake、フォルダーを開くモードを先に区別してください。表示されたフォルダーが、そのまますべてビルド対象になるとは限りません。
C++のvcxprojとSDK形式のC#では、フォルダー内のファイルをビルド対象へ含める仕組みが異なります。
「プロジェクトに含める」が見当たらないことだけで、Visual Studio 2022から機能が消えたとは言えません。すでに自動的に含まれている場合や、フォルダービューを開いている場合もあります。元の構成を保護してから、目的に合う方法を選びます。
最初に確認:プロジェクトの種類と取り込みの目的
| 現在の形式 | 通常の取り込み方 | 注意点 |
|---|---|---|
| SDK形式のC#(Project Sdkのあるcsproj) | プロジェクト配下の通常のcsは既定で対象になる | 同じファイルをCompile Includeで二重追加しない |
| 従来のC#等の明示登録形式 | すべてのファイルを表示→含める、または既存の項目を追加 | 登録された項目とビルドアクションを確認する |
| C++のvcxproj | 対象のcpp/hを追加し、項目とフィルターを確認 | MSBuildのワイルドカードをそのままIDE編集用へ貼らない |
| CMakeLists.txtがあるコード | CMake対応でフォルダーを開き、CMakeの対象へ追加 | vcxprojへ作り直すことが必須ではない |
| プロジェクトなしで既存コードを見る | ファイル→開く→フォルダー | 表示・編集とビルド設定を分ける |
| 既存のsln/csproj/vcxprojがある | 既存プロジェクト/ソリューションを開く | 必要ならソリューションへ既存プロジェクトを追加する |
「ファイルをコピーしてこのプロジェクトで管理したい」「元の場所を保って共有したい」「閲覧・編集だけしたい」も分けます。Microsoft Learnのプロジェクト作成の案内では、既存コードからのプロジェクト作成、既存項目・既存プロジェクトの追加を確認できます。
方法1:プロジェクト配下の実ファイルを含める
明示的に項目を登録する形式では、プロジェクト配下へコピーしたファイルを「すべてのファイルを表示」で見つけ、「プロジェクトに含める」から追加できます。MicrosoftのC++/WinRT移行例も、対象プロジェクトのフォルダーへコピーしてからこの操作で追加する手順です。
Repo
MyProject
MyProject.vcxproj
src
legacy
a.cpp
a.h
MySolution.sln
これは説明用の配置です。基準はslnのあるフォルダーではなく、対象のプロジェクトファイルのあるMyProjectです。Repoの直下に置いた別フォルダーがMyProjectの配下として自動表示されるとは限りません。
- 対象プロジェクトのフォルダーと、取り込みたい実ファイルの位置を確認する。
- 元のファイル・プロジェクトを保護し、コピーする方針なら目的の階層へコピーする。
- 「表示」→「ソリューション エクスプローラー」を開き、対象のプロジェクトを選択する。
- 「すべてのファイルを表示」が使える形式ではオンにし、未登録の項目を確認する。
- 対象のフォルダーやファイルを選び、「プロジェクトに含める」が表示される場合は追加する。
- 対象のソースファイル、ビルドアクション、実際のパスを確認してビルドする。
フォルダーの表示だけで確認を終えず、必要なファイルが含まれたかを確認します。追加された項目でも、Noneは通常のC++コンパイル対象ではありません。ヘッダーを表示へ追加したことと、コンパイラーがincludeで見つけられることも別です。
SDK形式のC#は、通常のcsを自動で含める
Microsoftの.NET SDKの既定項目の説明では、プロジェクト配下のソースを既定のパターンで含めます。標準的なC#なら配下の*.csがCompileに入り、bin/obj等は既定で除外されます。ファイルが既に入っているなら、登録のためのXML追加は不要です。
csprojの先頭に<Project Sdk="Microsoft.NET.Sdk">等があるかを確認します。拡張子がcsprojであることや、対象が.NET Frameworkであることだけでは、従来形式かSDK形式かを確定できません。
<ItemGroup>
<Compile Remove="src\legacy\**\*.cs" />
</ItemGroup>
このXMLは、既定で入る特定のC#ソースをコンパイル対象から外す断片例です。追加例ではありません。既存のProject内に入れる記述で、csproj全体をこの断片だけへ置き換えないでください。
NETSDK1022の公式説明は、既定項目と同じCompile等を明示追加すると重複エラーになることを説明しています。まず重複したIncludeを見直し、必要な範囲だけRemoveやUpdateを使います。ファイルを見せるためだけに、すべての既定項目を無効化しないでください。
方法2:C#のプロジェクト外ソースを元の位置のまま参照する
C#等でファイル選択画面に「リンクとして追加」がある場合は、「追加」→「既存の項目」で対象ファイルを選び、追加ボタンの選択肢から使います。メニューの有無はプロジェクト形式で異なるため、C++を含めた全形式で同じ操作と考えないでください。
Repo
MyProject
MyProject.csproj
Shared
Common.cs
Utils
Helper.cs
このようなSDK形式のC#の配置では、外部のソースをCompileへ追加して、LinkBaseで表示上の基準名を指定できます。以下はプロジェクト外のSharedを参照する断片例です。
<ItemGroup>
<Compile Include="..\Shared\**\*.cs" LinkBase="Shared" />
</ItemGroup>
MicrosoftのLinkBaseの説明では、外部項目の論理表示にLinkが使われ、LinkBaseとRecursiveDir等で階層を保てます。この例は実ファイルをMyProjectへコピーしません。リンク先のパス・ソース・依存パッケージ等も、ビルド環境に必要です。
リンクしたソースを編集すれば、元のSharedのファイルを編集します。複数プロジェクトで共有する場合は、対象フレームワークや条件付きコンパイルの違いも確認してください。プロジェクトだけZIPで渡して外部のSharedを含めなければ、相手側で同じ構成を再現できません。
方法3:C++は実ファイルの項目と表示フィルターを分ける
C++の通常のvcxprojでは、cppはClCompile、hはClInclude等の項目として登録します。外部のソースを使う場合も実際のファイルパスを確認し、プロジェクトの追加操作で登録された内容を確認します。ヘッダーの検索パスやライブラリのリンク設定は必要に応じて別に設定します。
<ItemGroup>
<ClCompile Include="src\legacy\a.cpp" />
<ClInclude Include="src\legacy\a.h" />
</ItemGroup>
これは既存vcxprojに明示的な項目を登録する断片例です。C++のプロジェクトには設定・プラットフォーム・インポート等も必要なので、このItemGroupだけを完全なプロジェクトファイルとして使わないでください。
vcxprojへワイルドカードを貼る前に
Microsoftのvcxprojとワイルドカードの公式説明は、IDEで編集するC++プロジェクト項目のワイルドカード等が標準ではサポートされないこと、読み込み・保存で問題が起き得ることを説明しています。ClCompile Include="src\legacy\**\*.cpp"を普通の項目へ貼るだけの方法を、一般的な解決策にはしません。
大量の項目を扱う場合は、明示列挙、ReplaceWildcardsInProjectItems、読み取り専用プロジェクト等の公式の選択肢を確認します。それぞれIDEでの編集・表示・読み込み時間等の条件があるため、既存の運用と同じかを確認して導入します。CMakeのコードなら、そのビルド定義を維持する方針も選べます。
vcxproj.filtersは実フォルダーではない
Microsoftのvcxproj.filtersの説明では、フィルターはソリューション エクスプローラー上の論理的な分類です。「ソース ファイル」「ヘッダー ファイル」等の表示は、ディスク上のフォルダー階層と一致する必要がありません。
階層を表示したい場合は、表示フィルターとファイルの所属を整理します。フィルターを作るだけでcppがビルドへ登録されたり、ディスクのフォルダーが作られたりするわけではありません。手作業で生成するならvcxprojとfiltersで同じ項目を参照しているかも確認します。
CMake・フォルダービューなら、作り直す前に既存方式を確認する
Microsoftのフォルダーを開く開発は、プロジェクトやソリューションがなくても、既存のコードを「ファイル」→「開く」→「フォルダー」から開く方法です。ソリューション エクスプローラーにフォルダーとファイルが表示され、編集・検索等ができます。表示された全ファイルがそのままビルドされるという意味ではありません。
MicrosoftのCMake対応の案内では、CMakeLists.txtを使う構成をそのまま開けます。新しいcppをビルドへ入れるならCMakeの対象やソース指定を見直し、構成・ビルドの出力を確認します。「プロジェクトに含める」がないためにvcxprojへ全面移行する必要はありません。
ソリューション フォルダーはプロジェクトの整理用
ソリューション フォルダーは、ソリューション内のプロジェクトや資料を論理的にまとめるものです。C++のフィルター、C#のリンクの表示、実ディレクトリと分けて考えます。ソリューションの資料として追加したソースが、特定プロジェクトのコンパイル対象へ自動登録されるとは限りません。
| 方法 | 実ファイル | 主な確認 |
|---|---|---|
| プロジェクト配下へコピー | 元とコピーの2つになる | 今後編集する場所・登録項目・依存を確認 |
| 外部ファイルの参照/リンク | 元のファイルを参照する | 相対パス、共有元、別環境での取得方法を確認 |
| ソリューション フォルダー | 表示上の整理が中心 | ビルド対象の登録とは別に扱う |
| フォルダーを開く/CMake | 既存の物理構成を使う | ビルド・起動の定義を確認 |
フォルダーが表示されない・ドラッグできないとき
- 本当に対象のプロジェクト配下へ配置したか、アドレスとプロジェクトファイルの位置を確認する。
- ソリューション エクスプローラーの検索・フィルターや、フォルダービュー/プロジェクトビューの状態を確認する。
- 使うプロジェクト形式で、すべてのファイルを表示・含める操作があるか確認する。
- SDK形式では既定CompileやRemove/Exclude、明示登録形式では登録されたパスを確認する。
- 通常のWindowsエクスプローラーからドラッグできない場合も、「追加」→「既存の項目」等の操作で対象を確認する。
- VSを管理者として起動している場合は、必要のない作業なら一度閉じて通常権限で開き直して比較する。
フォルダー取り込みだけのためにエクスプローラーを管理者にしたり、セキュリティ設定を一律に無効化したりしないでください。権限や組織の制約で読めないファイルは、保存先と必要なアクセスを確認します。特定のEnterprise版の不具合と断定する前に、同じプロジェクト形式・配置・権限で再現するかを確認します。
取り込み後の確認:表示とビルドを両方見る
- 必要なファイルが意図した場所から参照されているか、プロパティとプロジェクト差分で確認する。
- コンパイル対象と資料/リソースの扱いを確認する。C#の重複、C++の未登録を区別する。
- 構成とプラットフォームをそろえ、ビルドのエラーを確認する。
- 元の場所で管理するコードとコピーのどちらを編集したか確認する。
- チームへ渡す際は、外部ファイル・相対パス・依存関係が再現できるかを確認する。
名前変更や移動をした場合は、表示が追従したことだけでなく、プロジェクト・ビルド定義・includeや参照先の差分も確認します。除外と物理ファイルの削除も、メニューと確認内容を区別し、元のファイルが必要なら削除しないでください。

コメント