.vcxproj
檔案和通配符
Visual Studio IDE 不支援檔案中 .vcxproj
項目專案的某些建構。 這些不支援的建構包括通配符、分號分隔清單,或展開至多個檔案的 MSBuild 巨集。 .vcxproj
C++組建的項目系統比 MSBuild 更嚴格。 每個項目項目都必須有自己的 MSBuild 專案。 如需檔格式的詳細資訊 .vcxproj
,請參閱 .vcxproj
和 .props
檔案結構。
IDE 不支援這些建構範例:
<ItemGroup>
<None Include="*.txt">
<ClCompile Include="a.cpp;b.cpp"/>
<ClCompile Include="@(SomeItems)" />
</ItemGroup>
.vcxproj
如果包含這些建構的項目檔在IDE中載入,則專案可能一開始可能正常運作。 不過,一旦 Visual Studio 修改專案,然後儲存在磁碟上,就可能會發生問題。 您可能會遇到隨機損毀和未定義的行為。
在 Visual Studio 2019 16.7 版中,當 Visual Studio 載入 .vcxproj
項目檔時,它會自動偵測項目專案中不支援的專案。 在方案載入期間,您會在 [輸出] 視窗中看到警告。
Visual Studio 2019 16.7 版也新增唯讀項目支援。 只讀支援可讓 IDE 使用手動撰寫的專案,這些項目沒有 IDE 可編輯項目的額外限制。
如果您有使用 .vcxproj
一或多個不支援建構的檔案,您可以使用下列其中一個選項,在 IDE 中載入時不會顯示警告:
- 明確列出所有專案
- 將項目標示為唯讀
- 將通配符專案移至目標主體
明確列出所有專案
目前,無法讓通配符擴充項目顯示在非只讀專案的 方案總管 視窗中。 方案總管 預期項目會明確列出所有專案。
若要讓 .vcxproj
專案在 Visual Studio 2019 16.7 版或更新版本中自動展開通配符,請將 屬性設定 ReplaceWildcardsInProjectItems
為 true
。 建議您在根目錄中建立 Directory.Build.props
檔案,並使用下列內容:
<Project>
<PropertyGroup>
<ReplaceWildcardsInProjectItems>true</ReplaceWildcardsInProjectItems>
</PropertyGroup>
</Project>
將項目標示為唯讀
在 Visual Studio 2019 16.7 版和更新版本中,您可以將項目標示為 只讀。 若要將項目標示為唯讀,請將下列屬性新增至檔案 .vcxproj
,或將其匯入的任何檔案:
<PropertyGroup>
<ReadOnlyProject>true</ReadOnlyProject>
</PropertyGroup>
此 <ReadOnlyProject>
設定可防止 Visual Studio 編輯和儲存專案,因此您可以使用其中的任何 MSBuild 建構,包括通配符。
請務必知道,如果 Visual Studio 在檔案中的項目專案或任何匯入專案專案 .vcxproj
中偵測到通配符,則無法使用專案快取。 如果您有許多使用通配符的專案,IDE 中的方案載入時間會更長。
將通配符專案移至目標主體
您可能想要使用通配符來收集資源、新增產生的來源等等。 如果您不需要列在 [方案總管] 視窗中,您可以改用此程式:
變更專案群組的名稱以新增通配符。 例如,而不是:
<Image Include="*.bmp" /> <ClCompile Include="*.cpp" />
將它變更為:
<_WildCardImage Include="*.bmp" /> <_WildCardClCompile Include="*.cpp" />
將此內容新增至您的
.vcxproj
檔案。 或者,將它新增至Directory.Build.targets
根目錄中的檔案,以影響該根目錄下的所有專案:<Target Name="AddWildCardItems" AfterTargets="BuildGenerateSources"> <ItemGroup> <Image Include="@(_WildCardImage)" /> <ClCompile Include="@(_WildCardClCompile)" /> </ItemGroup> </Target>
這項變更會使組建在檔案中
.vcxproj
定義時看到專案。 不過,現在它們不會顯示在 [方案總管] 視窗中,而且不會在 IDE 中造成問題。若要在
_WildCardClCompile
編輯器中開啟這些檔案時顯示專案的正確 IntelliSense,請新增下列內容:<PropertyGroup> <ComputeCompileInputsTargets> AddWildCardItems $(ComputeCompileInputsTargets) </ComputeCompileInputsTargets> </PropertyGroup>
實際上,您可以將通配符用於目標主體內的任何專案。 您也可以在 ItemGroup
中,使用未由 ProjectSchemaDefinition
定義為專案專案的通配符。
注意
如果您將通配符包含從.vcxproj
檔案移至匯入的檔案,這些通配符將不會顯示在 方案總管 視窗中。 這項變更也可讓您的專案在 IDE 中載入,而不需要修改。 不過,不建議使用此方法,因為它會停用專案快取。