Visual Studio C++ Proje sistemi genişletilebilirliği ve araç takımı tümleştirmesi
Visual C++ proje sistemi .vcxproj dosyaları için kullanılır. Visual Studio Ortak Proje Sistemi'ni (CPS) temel alır ve yeni araç setlerinin, derleme mimarilerinin ve hedef platformların kolay tümleştirilmesi için ek C++ özel genişletilebilirlik noktaları sağlar.
C++ MSBuild hedef yapısı
Tüm .vcxproj dosyaları şu dosyaları içeri aktarır:
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
Bu dosyalar kendi başlarına küçük tanımlar. Bunun yerine, diğer dosyaları şu özellik değerlerine göre içeri aktarır:
$(ApplicationType)
Örnekler: Windows Mağazası, Android, Linux
$(ApplicationTypeRevision)
Bu, major.minor[.build[.revision]] formunun geçerli bir sürüm dizesi olmalıdır.
Örnekler: 1.0, 10.0.0.0
$(Platform)
Geçmiş nedenlerden dolayı "Platform" adlı derleme mimarisi.
Örnekler: Win32, x86, x64, ARM
$(PlatformToolset)
Örnekler: v140, v141, v141_xp, llvm
Bu özellik değerleri, kök klasörün altında $(VCTargetsPath)
klasör adlarını belirtir:
$(VCTargetsPath)
\
Uygulama Türü\
$(ApplicationType)
\
$(ApplicationTypeRevision)
\
Platformlar\
$(Platform)
\
PlatformToolsets\
$(PlatformToolset)
Platformlar\
$(Platform)
\
PlatformToolsets\
$(PlatformToolset)
$(VCTargetsPath)
\Platformlar\ klasörü, Windows Masaüstü projeleri için boş olduğunda $(ApplicationType)
kullanılır.
Yeni platform araç takımı ekleme
Mevcut Win32 platformu için "MyToolset" gibi yeni bir araç kümesi eklemek için\Platforms\Win32\PlatformToolsets\ altında $(VCTargetsPath)
bir MyToolset klasörü oluşturun ve içinde Toolset.props ve Toolset.targets dosyaları oluşturun.
PlatformToolsets altındaki her klasör adı, Proje Özellikleri iletişim kutusunda, burada gösterildiği gibi belirtilen platform için kullanılabilir bir Platform Araç Takımı olarak görünür:
Bu araç takımının desteklediği mevcut platform klasörlerinde benzer MyToolset klasörleri ve Toolset.props ve Toolset.targets dosyaları oluşturun.
Yeni platform ekleme
"Platformum" gibi yeni bir platform eklemek için\ Platformlar\ altında $(VCTargetsPath)
bir MyPlatform klasörü oluşturun ve içindeki Platform.default.props, Platform.props ve Platform.targets dosyalarını oluşturun. Ayrıca bir $(VCTargetsPath)
\Platforms\MyPlatform\PlatformToolsets\ klasörü oluşturun ve içinde en az bir araç takımı oluşturun.
Her birinin Platformlar klasörünün altındaki tüm klasör adları ve $(ApplicationTypeRevision)
IDE'de bir proje için kullanılabilir Platform seçenekleri olarak görünür.$(ApplicationType)
Yeni uygulama türü ekleme
Yeni bir uygulama türü eklemek için\ Uygulama Türü\ altında bir MyApplicationType klasörü oluşturun ve içinde bir Defaults.props dosyası oluşturun.$(VCTargetsPath)
Bir uygulama türü için en az bir düzeltme gerekir, bu nedenle bir $(VCTargetsPath)
\Application Type\MyApplicationType\1.0 klasörü oluşturun ve içinde bir Defaults.props dosyası oluşturun. Ayrıca bir $(VCTargetsPath)
\ApplicationType\MyApplicationType\1.0\Platforms klasörü oluşturmanız ve içinde en az bir platform oluşturmanız gerekir.
$(ApplicationType)
ve $(ApplicationTypeRevision)
özellikleri kullanıcı arabiriminde görünmez. Bunlar proje şablonlarında tanımlanır ve proje oluşturulduktan sonra değiştirilemez.
.vcxproj içeri aktarma ağacı
Microsoft C++ props ve targets dosyaları için basitleştirilmiş bir içeri aktarma ağacı şöyle görünür:
$(VCTargetsPath)
\Microsoft.Cpp.Default.props
$(MSBuildExtensionsPath)
\$(MSBuildToolsVersion)
\Microsoft.Common.props
$(VCTargetsPath)
\ImportBefore\Default\*.Sahne
$(VCTargetsPath)
\Uygulama Türü\\$(ApplicationType)
Default.props
$(VCTargetsPath)
\Uygulama Türü$(ApplicationTypeRevision)
\$(ApplicationType)
\\Default.props
$(VCTargetsPath)
\Uygulama Türü$(ApplicationTypeRevision)
\$(ApplicationType)
\\Platformları\$(Platform)
\Platform.default.props
$(VCTargetsPath)
\ImportAfter\Default\*.Sahne
Windows Masaüstü projeleri öğesini tanımlamaz $(ApplicationType)
, bu nedenle yalnızca içeri aktarır
$(VCTargetsPath)
\Microsoft.Cpp.Default.props
$(MSBuildExtensionsPath)
\$(MSBuildToolsVersion)
\Microsoft.Common.props
$(VCTargetsPath)
\ImportBefore\Default\*.Sahne
$(VCTargetsPath)
\Platformlar\\$(Platform)
Platform.default.props
$(VCTargetsPath)
\ImportAfter\Default\*.Sahne
Platform klasörü konumlarını $(_PlatformFolder)
tutmak $(Platform)
için özelliğini kullanacağız. Bu özellik
$(VCTargetsPath)
\Platformlar\$(Platform)
windows masaüstü uygulamaları için ve
$(VCTargetsPath)
\Uygulama Türü$(ApplicationTypeRevision)
\$(ApplicationType)
\\Platformları\$(Platform)
diğer her şey için.
Props dosyaları şu sırayla içeri aktarılır:
$(VCTargetsPath)
\Microsoft.Cpp.props
$(_PlatformFolder)
\Platform.props
$(VCTargetsPath)
\Microsoft.Cpp.Platform.props
$(_PlatformFolder)
\ImportBefore\*.Sahne
$(_PlatformFolder)
\PlatformToolsets\\$(PlatformToolset)
Toolset.props
$(_PlatformFolder)
\ImportAfter\*.Sahne
Hedef dosyaları şu sırayla içeri aktarılır:
$(VCTargetsPath)
\Microsoft.Cpp.targets
$(VCTargetsPath)
\Microsoft.Cpp.Current.targets
$(_PlatformFolder)
\Platform.targets
$(VCTargetsPath)
\Microsoft.Cpp.Platform.targets
$(_PlatformFolder)
\ImportBefore\*.Hedef
$(_PlatformFolder)
\PlatformToolsets\\$(PlatformToolset)
Toolset.target
$(_PlatformFolder)
\ImportAfter\*.Hedef
Araç takımınız için bazı varsayılan özellikler tanımlamanız gerekiyorsa, uygun ImportBefore ve ImportAfter klasörlerine dosya ekleyebilirsiniz.
Toolset.props ve Toolset.targets dosyalarını yazma
Toolset.props ve Toolset.targets dosyaları, bu araç takımı kullanıldığında derleme sırasında ne olacağı üzerinde tam denetime sahiptir. Ayrıca kullanılabilir hata ayıklayıcılarını, Özellik Sayfaları iletişim kutusundaki içerik gibi bazı IDE kullanıcı arabirimini ve proje davranışının diğer bazı yönlerini de denetleyebilirler.
Bir araç takımı derleme işleminin tamamını geçersiz kılabilir ancak genellikle araç takımınızın bazı derleme adımlarını değiştirmesini veya eklemesini ya da mevcut derleme işleminin bir parçası olarak farklı derleme araçlarını kullanmasını istersiniz. Bu hedefe ulaşmak için, araç takımınızın içeri aktarabileceği bir dizi yaygın özellik ve hedef dosyası vardır. Araç takımınızın ne yapmak istediğinize bağlı olarak, bu dosyaları içeri aktarma veya örnek olarak kullanmak yararlı olabilir:
$(VCTargetsPath)
\Microsoft.CppCommon.targetsBu dosya, yerel derleme işleminin ana bölümlerini tanımlar ve ayrıca şunları içeri aktarır:
$(VCTargetsPath)
\Microsoft.CppBuild.targets$(VCTargetsPath)
\Microsoft.BuildSteps.targets$(MSBuildToolsPath)
\Microsoft.Common.Targets
$(VCTargetsPath)
\Microsoft.Cpp.Common.propsMicrosoft derleyicilerini kullanan ve Windows'u hedefleyen araç kümeleri için varsayılanları ayarlar.
$(VCTargetsPath)
\Microsoft.Cpp.WindowsSDK.propsBu dosya, Windows SDK'sının konumunu belirler ve Windows'ı hedefleyen uygulamalar için bazı önemli özellikleri tanımlar.
Araç kümesine özgü hedefleri varsayılan C++ derleme işlemiyle tümleştirme
Varsayılan C++ derleme işlemi Microsoft.CppCommon.targets içinde tanımlanır. Buradaki hedefler belirli bir derleme aracı çağırmaz; ana derleme adımlarını, bunların sırasını ve bağımlılıklarını belirtir.
C++ derlemesinde aşağıdaki hedefler tarafından temsil edilen üç ana adım vardır:
BuildGenerateSources
BuildCompile
BuildLink
Her derleme adımı bağımsız olarak yürütülebileceğinden, bir adımda çalışan hedefler farklı bir adımın parçası olarak çalışan hedeflerde tanımlanan öğe gruplarına ve özelliklere dayanamaz. Bu bölme, belirli derleme performansı iyileştirmelerine olanak tanır. Varsayılan olarak kullanılmasa da, yine de bu ayrımı yerine getirmek için teşvik edilirsiniz.
Her adımda çalıştırılan hedefler şu özellikler tarafından denetlenmektedir:
$(BuildGenerateSourcesTargets)
$(BuildCompileTargets)
$(BeforeBuildLinkTargets)
Her adımda Önce ve Sonra özellikleri de vardır.
<Target
Name="_BuildGenerateSourcesAction"
DependsOnTargets="$(CommonBuildOnlyTargets);$(BeforeBuildGenerateSourcesTargets);$(BuildGenerateSourcesTargets);$(AfterBuildGenerateSourcesTargets)" />
<Target
Name="\_BuildCompileAction"
DependsOnTargets="$(CommonBuildOnlyTargets);$(BeforeBuildCompileTargets);$(BuildCompileTargets);$(AfterBuildCompileTargets)" />
<Target
Name="\_BuildLinkAction"
DependsOnTargets="$(CommonBuildOnlyTargets);$(BeforeBuildLinkTargets);$(BuildLinkTargets);$(AfterBuildLinkTargets)" />
Her adımda yer alan hedeflerin örnekleri için Microsoft.CppBuild.targets dosyasına bakın:
<BuildCompileTargets Condition="'$(ConfigurationType)'\!='Utility'">
$(BuildCompileTargets);
_ClCompile;
_ResGen;
_ResourceCompile;
$(BuildLibTargets);
</BuildCompileTargets>
gibi _ClCompile
hedeflere bakarsanız, bunların doğrudan kendi başlarına hiçbir şey yapmadıklarını, bunun yerine gibi ClCompile
diğer hedeflere bağlı olduklarını görürsünüz:
<Target Name="_ClCompile"
DependsOnTargets="$(BeforeClCompileTargets);$(ComputeCompileInputsTargets);MakeDirsForCl;ClCompile;$(AfterClCompileTargets)" >
</Target>
ClCompile
ve diğer derleme aracına özgü hedefler, Microsoft.CppBuild.targets içinde boş hedefler olarak tanımlanır:
<Target Name="ClCompile"/>
ClCompile
Hedef boş olduğundan, araç takımı tarafından geçersiz kılınmadığı sürece gerçek bir derleme eylemi gerçekleştirilmez. Araç takımı hedefleri hedefi geçersiz kılabilirClCompile
, yani Microsoft.CppBuild.targets içeri aktarıldıktan sonra başka bir ClCompile
tanım içerebilir:
<Target Name="ClCompile"
Condition="'@(ClCompile)' != ''"
DependsOnTargets="SelectClCompile">
<!-- call some MSBuild tasks -->
</Target>
Visual Studio platformlar arası destek uygulamadan önce oluşturulan adına rağmen hedefin ClCompile
CL.exe çağırması gerekmez. Ayrıca uygun MSBuild görevlerini kullanarak Clang, gcc veya diğer derleyicileri çağırabilir.
Hedefin ClCompile
, tek dosya derleme komutunun SelectClCompile
IDE'de çalışması için gereken hedef dışında hiçbir bağımlılığı olmamalıdır.
Araç takımı hedeflerinde kullanılacak MSBuild görevleri
Gerçek bir derleme aracını çağırmak için hedefin bir MSBuild görevi çağırması gerekir. Çalıştırılacak bir komut satırı belirtmenize olanak tanıyan temel bir Exec görevi vardır. Ancak, derleme araçlarının genellikle artımlı derlemeleri izlemek için birçok seçeneği, girişi ve çıkışı vardır, bu nedenle bunlar için özel görevlere sahip olmak daha mantıklıdır. Örneğin, CL
görev MSBuild özelliklerini CL.exe anahtarlara çevirir, bunları bir yanıt dosyasına yazar ve CL.exe çağırır. Ayrıca sonraki artımlı derlemeler için tüm giriş ve çıkış dosyalarını izler. Daha fazla bilgi için bkz . Artımlı derlemeler ve güncel denetimler.
Microsoft.Cpp.Common.Tasks.dll şu görevleri uygular:
BSCMake
CL
ClangCompile
(clang-gcc anahtarları)LIB
LINK
MIDL
Mt
RC
XDCMake
CustomBuild
(Exec gibi ama giriş ve çıkış izleme ile)SetEnv
GetOutOfDateItems
Mevcut bir araçla aynı eylemi gerçekleştiren ve benzer komut satırı anahtarları (clang-cl ve CL gibi) olan bir aracınız varsa, her ikisi için de aynı görevi kullanabilirsiniz.
Derleme aracı için yeni bir görev oluşturmanız gerekiyorsa, aşağıdaki seçenekler arasından seçim yapabilirsiniz:
Bu görevi nadiren kullanıyorsanız veya derlemeniz için birkaç saniye önemli değilse, MSBuild 'satır içi' görevlerini kullanabilirsiniz:
Xaml görevi (özel derleme kuralı)
Bir Xaml görev bildirimi örneği için bkz
$(VCTargetsPath)
\. BuildCustomizations\masm.xml ve kullanımı için bkz$(VCTargetsPath)
\. BuildCustomizations\masm.targets.
Daha iyi görev performansı istiyorsanız veya yalnızca daha karmaşık işlevlere ihtiyacınız varsa, normal MSBuild görev yazma işlemini kullanın.
Aracın tüm girişleri ve çıkışları araç komut satırında listelenmiyorsa, , ve durumlarında
CL
olduğu gibi ve otomatik giriş ve çıkış dosyası izleme ile .tlog dosyası oluşturmak istiyorsanız, görevinizi sınıfındanMicrosoft.Build.CPPTasks.TrackedVCToolTask
türeyin.RC
MIDL
Şu anda, temel ToolTask sınıfı için belgeler olsa da, sınıfın ayrıntılarınaTrackedVCToolTask
yönelik bir örnek veya belge yoktur. Bu özellikle ilginizi çekerse, sesinizi Geliştirici Topluluğu isteğine ekleyin.
Artımlı derlemeler ve güncel denetimler
Varsayılan MSBuild artımlı derleme hedefleri ve Outputs
özniteliklerini kullanırInputs
. Bunları belirtirseniz, MSBuild yalnızca girişlerden herhangi birinin tüm çıkışlardan daha yeni bir zaman damgasına sahip olması durumunda hedefi çağırır. Kaynak dosyalar genellikle diğer dosyaları içerdiğinden veya içeri aktardığından ve derleme araçları araç seçeneklerine bağlı olarak farklı çıkışlar ürettiğinden, MSBuild hedeflerindeki tüm olası girişleri ve çıkışları belirtmek zordur.
Bu sorunu yönetmek için C++ derlemesi artımlı derlemeleri desteklemek için farklı bir teknik kullanır. Hedeflerin çoğu giriş ve çıkış belirtmez ve sonuç olarak her zaman derleme sırasında çalışır. tarafından çağrılan görevler, .tlog uzantısına sahip tlog dosyalarına tüm girişler ve çıkışlar hakkında bilgi yazar. .tlog dosyaları, nelerin değiştiğini ve yeniden oluşturulması gerektiğini ve nelerin güncel olduğunu denetlemek için sonraki derlemeler tarafından kullanılır. .tlog dosyaları, IDE'de varsayılan derleme güncel denetimi için de tek kaynaktır.
Yerel araç görevleri, tüm girişleri ve çıkışları belirlemek için tracker.exe ve MSBuild tarafından sağlanan FileTracker sınıfını kullanır.
Microsoft.Build.CPPTasks.Common.dll genel soyut temel sınıfı tanımlar TrackedVCToolTask
. Yerel araç görevlerinin çoğu bu sınıftan türetilir.
Visual Studio 2017 güncelleştirme 15.8'den başlayarak, Microsoft.Cpp.Common.Tasks.dll'de uygulanan görevi kullanarak GetOutOfDateItems
bilinen giriş ve çıkışlara sahip özel hedefler için .tlog dosyaları oluşturabilirsiniz.
Alternatif olarak, görevi kullanarak WriteLinesToFile
bunları oluşturabilirsiniz. _WriteMasmTlogs
Örnek olarak BuildCustomizations\masm.targets içindeki $(VCTargetsPath)
\hedefe bakın.
.tlog dosyaları
Üç tür .tlog dosyası vardır: okuma, yazma ve komut satırı. .tlog dosyalarını okuma ve yazma, artımlı derlemeler ve IDE'deki güncel denetim tarafından kullanılır. Komut satırı .tlog dosyaları yalnızca artımlı derlemelerde kullanılır.
MSBuild, .tlog dosyalarını okumak ve yazmak için şu yardımcı sınıfları sağlar:
FlatTrackingData sınıfı, hem okuma hem de yazma .tlog dosyalarına erişmek ve çıkışlardan daha yeni olan girişleri veya bir çıkış eksikse tanımlamak için kullanılabilir. Güncel denetimde kullanılır.
Komut satırı .tlog dosyaları, derlemede kullanılan komut satırları hakkında bilgi içerir. Bunlar güncel denetimler için değil yalnızca artımlı derlemeler için kullanılır, bu nedenle iç biçim bunları üreten MSBuild görevi tarafından belirlenir.
.tlog biçimini okuma
Okuma .tlog dosyaları (*.read.*.tlog), kaynak dosyalar ve bağımlılıkları hakkında bilgi içerir.
Satırın başındaki şapka işareti (^), bir veya daha fazla kaynağı gösterir. Aynı bağımlılıkları paylaşan kaynaklar dikey çubukla (| ) ayrılır.
Bağımlılık dosyaları kaynaklardan sonra listelenir ve her biri kendi satırında bulunur. Tüm dosya adları tam yoldur.
Örneğin, proje kaynaklarınızın F:\test\ConsoleApplication1\ConsoleApplication1 içinde bulunduğunu varsayalım. Class1.cpp kaynak dosyanızda şunlar varsa:
#include "stdafx.h" //precompiled header
#include "Class1.h"
ardından CL.read.1.tlog dosyası kaynak dosyayı ve ardından iki bağımlılığını içerir:
^F:\TEST\CONSOLEAPPLICATION1\CONSOLEAPPLICATION1\CLASS1.CPP
F:\TEST\CONSOLEAPPLICATION1\CONSOLEAPPLICATION1\DEBUG\CONSOLEAPPLICATION1.PCH
F:\TEST\CONSOLEAPPLICATION1\CONSOLEAPPLICATION1\CLASS1.H
Büyük harfle dosya adları yazmak gerekli değildir, ancak bazı araçlar için kolaylık sağlar.
.tlog biçimi yazma
Yazma .tlog (*.write.*.tlog) dosyaları kaynakları ve çıkışları bağlar.
Satırın başındaki şapka işareti (^), bir veya daha fazla kaynağı gösterir. Birden çok kaynak dikey çubukla (|) ayrılır.
Kaynaklardan oluşturulan çıkış dosyaları, kaynaklardan sonra ve her biri kendi satırında listelenmelidir. Tüm dosya adları tam yol olmalıdır.
Örneğin, Class1.cpp ek kaynak dosyası olan basit bir ConsoleApplication projesi için link.write.1.tlog dosyası şunları içerebilir:
^F:\TEST\CONSOLEAPPLICATION1\CONSOLEAPPLICATION1\DEBUG\CLASS1.OBJ|F:\TEST\CONSOLEAPPLICATION1\CONSOLEAPPLICATION1\DEBUG\CONSOLEAPPLICATION1.OBJ|F:\TEST\CONSOLEAPPLICATION1\CONSOLEAPPLICATION1\DEBUG\STDAFX.OBJ
F:\TEST\CONSOLEAPPLICATION1\DEBUG\CONSOLEAPPLICATION1.ILK
F:\TEST\CONSOLEAPPLICATION1\DEBUG\CONSOLEAPPLICATION1.EXE
F:\TEST\CONSOLEAPPLICATION1\DEBUG\CONSOLEAPPLICATION1.PDB
Tasarım zamanı derlemesi
IDE'de .vcxproj projeleri, projeden ek bilgi almak ve çıkış dosyalarını yeniden oluşturmak için bir msbuild hedefleri kümesi kullanır. Bu hedeflerden bazıları yalnızca tasarım zamanı derlemelerinde kullanılır, ancak bunların çoğu hem normal derlemelerde hem de tasarım zamanı derlemelerinde kullanılır.
Tasarım zamanı derlemeleri hakkında genel bilgi için Tasarım zamanı derlemeleri için CPS belgelerine bakın. Bu belgeler yalnızca Visual C++ projeleri için kısmen geçerlidir.
CompileDesignTime
Tasarım zamanı derlemeleri belgelerinde belirtilen ve Compile
hedefleri hiçbir zaman .vcxproj projeler için çalışmaz. Visual C++ .vcxproj projeleri, IntelliSense bilgilerini almak için farklı tasarım zamanı hedefleri kullanır.
IntelliSense bilgileri için tasarım zamanı hedefleri
.vcxproj projelerinde kullanılan tasarım zamanı hedefleri Microsoft.Cpp.DesignTime.targets içinde $(VCTargetsPath)
\tanımlanır.
Hedef, GetClCommandLines
IntelliSense için derleyici seçeneklerini toplar:
<Target
Name="GetClCommandLines"
Returns="@(ClCommandLines)"
DependsOnTargets="$(DesignTimeBuildInitTargets);$(ComputeCompileInputsTargets)">
DesignTimeBuildInitTargets
– yalnızca tasarım zamanı hedefleri, tasarım zamanı derlemesi başlatma için gereklidir. Bu hedefler, performansı geliştirmek için bazı normal derleme işlevlerini devre dışı bırakır.ComputeCompileInputsTargets
– derleyici seçeneklerini ve öğelerini değiştiren bir hedef kümesi. Bu hedefler hem tasarım zamanında hem de normal derlemelerde çalışır.
Hedef, IntelliSense için kullanılacak komut satırını oluşturmak üzere görevi çağırır CLCommandLine
. Adına rağmen, yalnızca CL seçeneklerini değil, Clang ve gcc seçeneklerini de işleyebilir. Derleyici anahtarlarının türü özelliği tarafından ClangMode
denetlenmektedir.
Şu anda, intelliSense altyapısının CLCommandLine
ayrıştırması daha kolay olduğundan, görev tarafından üretilen komut satırı her zaman CL anahtarlarını (Clang modunda bile) kullanır.
Derlemeden önce (normal veya tasarım zamanı) çalışan bir hedef ekliyorsanız, bunun tasarım zamanı derlemelerini bozmadığından veya performansı etkilemediğinden emin olun. Hedefinizi test etmenin en basit yolu bir Geliştirici komut istemi açmak ve şu komutu çalıştırmaktır:
msbuild /p:SolutionDir=*solution-directory-with-trailing-backslash*;Configuration=Debug;Platform=Win32;BuildingInsideVisualStudio=true;DesignTimebuild=true /t:\_PerfIntellisenseInfo /v:d /fl /fileloggerparameters:PerformanceSummary \*.vcxproj
Bu komut, sonunda hedefler ve görevler için performans özetini içeren ayrıntılı bir derleme günlüğü (msbuild.log) oluşturur.
Tasarım zamanı derlemeleri için değil, yalnızca normal derlemeler için anlamlı olan tüm işlemlerde kullandığınızdan Condition ="'$(DesignTimeBuild)' != 'true'"
emin olun.
Kaynak oluşturan tasarım zamanı hedefleri
Bu özellik Masaüstü yerel projeleri için varsayılan olarak devre dışıdır ve şu anda önbelleğe alınmış projelerde desteklenmez.
Bir proje öğesi için meta veriler tanımlanmışsa GeneratorTarget
, hedef hem proje yüklendiğinde hem de kaynak dosya değiştirildiğinde otomatik olarak çalıştırılır.
Örneğin, .xaml dosyalarından otomatik olarak .cpp veya .h dosyaları oluşturmak için MSBuild $(VSInstallDir)
\\Microsoft\WindowsXaml\v16.0\*\Microsoft.Windows.UI.Xaml.CPP.Targets dosyaları şu varlıkları tanımlar:
<ItemDefinitionGroup>
<Page>
<GeneratorTarget>DesignTimeMarkupCompilation</GeneratorTarget>
</Page>
<ApplicationDefinition>
<GeneratorTarget>DesignTimeMarkupCompilation</GeneratorTarget>
</ApplicationDefinition>
</ItemDefinitionGroup>
<Target Name="DesignTimeMarkupCompilation">
<!-- BuildingProject is used in Managed builds (always true in Native) -->
<!-- DesignTimeBuild is used in Native builds (always false in Managed) -->
<CallTarget Condition="'$(BuildingProject)' != 'true' Or $(DesignTimeBuild) == 'true'" Targets="DesignTimeMarkupCompilationCT" />
</Target>
Kaynak dosyaların kaydedilmemiş içeriğini almak için kullanmak Task.HostObject
için, hedefler ve görev bir pkgdef içindeki belirli projeler için MsbuildHostObjects olarak kaydedilmelidir:
\[$RootKey$\\Projects\\{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\\MSBuildHostObjects\]
\[$RootKey$\\Projects\\{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\\MSBuildHostObjects\\DesignTimeMarkupCompilationCT;CompileXaml\]
@="{83046B3F-8984-444B-A5D2-8029DEE2DB70}"
Visual Studio IDE'de Visual C++ proje genişletilebilirliği
Visual C++ proje sistemi VS Proje Sistemini temel alır ve genişletilebilirlik noktalarını kullanır. Ancak, proje hiyerarşisi uygulaması CPS'ye değil Visual C++'ya özgüdür, bu nedenle hiyerarşi genişletilebilirliği proje öğeleriyle sınırlıdır.
Proje özellik sayfaları
Genel tasarım bilgileri için bkz . VC++ Projeleri için Çerçeve Çoklu Hedefleme.
Basit bir ifadeyle, bir C++ projesinin Proje Özellikleri iletişim kutusunda gördüğünüz özellik sayfaları kural dosyaları tarafından tanımlanır. Kural dosyası, özellik sayfasında gösterilecek bir özellik kümesini ve bunların proje dosyasına nasıl ve nereye kaydedileceğini belirtir. Kural dosyaları, Xaml biçimini kullanan .xml dosyalardır. Bunları serileştirmek için kullanılan türler Microsoft.Build.Framework.XamlTypes içinde açıklanmıştır. Projelerde kural dosyalarının kullanımı hakkında daha fazla bilgi için bkz . Özellik Sayfası XML kural dosyaları.
Kural dosyalarının öğe grubuna PropertyPageSchema
eklenmesi gerekir:
<ItemGroup>
<PropertyPageSchema Include="$(VCTargetsPath)$(LangID)\general.xml;"/>
<PropertyPageSchema Include="$(VCTargetsPath)$(LangID)\general_file.xml">
<Context>File</Context>
</PropertyPageSchema>
</ItemGroup>
Context
meta veri sınırları kural görünürlüğü, aynı zamanda kural türü tarafından denetlenen ve şu değerlerden birine sahip olabilir:
Project
| File
| PropertySheet
CPS bağlam türü için diğer değerleri destekler, ancak Visual C++ projelerinde kullanılmaz.
Kuralın birden fazla bağlamda görünür olması gerekiyorsa, burada gösterildiği gibi bağlam değerlerini ayırmak için noktalı virgül (;) kullanın:
<PropertyPageSchema Include="$(MyFolder)\MyRule.xml">
<Context>Project;PropertySheet</Context>
</PropertyPageSchema>
Kural biçimi ve ana türler
Kural biçimi basittir, bu nedenle bu bölüm yalnızca kuralın kullanıcı arabiriminde nasıl göründüğünü etkileyen öznitelikleri açıklar.
<Rule
Name="ConfigurationGeneral"
DisplayName="General"
PageTemplate="generic"
Description="General"
xmlns="http://schemas.microsoft.com/build/2009/properties">
özniteliği, PageTemplate
kuralın Özellik Sayfaları iletişim kutusunda nasıl görüntüleneceğini tanımlar. özniteliği şu değerlerden birine sahip olabilir:
Öznitelik | Açıklama |
---|---|
generic |
Tüm özellikler Kategori başlıkları altında bir sayfada gösterilir Kural ve bağlamları için Project görünür olabilir, ancak için görünmezFile .PropertySheet Örnek: $(VCTargetsPath) \1033\general.xml |
tool |
Kategoriler alt sayfa olarak gösterilir. Kural tüm bağlamlarda görülebilir: Project , PropertySheet ve File .Kural, yalnızca, kural adı öğe grubuna dahil edilmediği sürece Proje ItemType Rule.DataSource Özellikleri'nde ProjectTools görünür.Örnek: $(VCTargetsPath) \1033\clang.xml |
debugger |
Sayfa, Hata Ayıklama sayfasının bir parçası olarak gösterilir. Kategoriler şu anda yok sayılır. Kural adı, Hata Ayıklama Başlatıcısı MEF nesnesinin ExportDebugger özniteliğiyle eşleşmelidir.Örnek: $(VCTargetsPath) \1033\debugger_local_windows.xml |
custom | Özel şablon. Şablonun adı MEF nesnesinin özniteliğiyle PropertyPageUIFactoryProvider eşleşmelidirExportPropertyPageUIFactoryProvider . Bkz . Microsoft.VisualStudio.ProjectSystem.Designers.Properties.IPropertyPageUIFactoryProvider.Örnek: $(VCTargetsPath) \1033\userMacros.xml |
Kural, Property Grid tabanlı şablonlardan birini kullanıyorsa özellikleri için şu genişletilebilirlik noktalarını kullanabilir:
Kuralı genişletme
Mevcut bir kuralı kullanmak istiyorsanız ancak yalnızca birkaç özellik eklemeniz veya kaldırmanız (başka bir ifadeyle gizlemek) istiyorsanız, bir Uzantı kuralı oluşturabilirsiniz.
Kuralı geçersiz kılma
Araç takımınızın proje varsayılan kurallarının çoğunu kullanmasını ancak yalnızca bir veya birkaçını değiştirmesini isteyebilirsiniz. Örneğin, yalnızca C/C++ kuralını farklı derleyici anahtarlarını gösterecek şekilde değiştirmek istediğinizi varsayalım. Mevcut kuralla aynı ada ve görünen ada sahip yeni bir kural sağlayabilir ve varsayılan cpp hedeflerinin içeri aktarılmasından sonra bu PropertyPageSchema
kuralı öğe grubuna ekleyebilirsiniz. Projede belirli bir ada sahip tek bir kural kullanılır ve öğe grubuna PropertyPageSchema
eklenen son kural kazanır.
Proje kalemleri
ProjectItemsSchema.xml dosyası, Proje Öğeleri olarak ele alınan Öğeler için ve ItemType
değerlerini tanımlar ContentType
ve yeni bir dosyanın hangi Öğe grubuna ekleneceğini belirlemek için öğeleri tanımlarFileExtension
.
Varsayılan ProjectItemsSchema dosyası 1033\ProjectItemsSchema.xml bulunur.$(VCTargetsPath)
\ Genişletmek için, MyProjectItemsSchema.xml gibi yeni bir ada sahip bir şema dosyası oluşturmanız gerekir:
<ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties">
<ItemType Name="MyItemType" DisplayName="C/C++ compiler"/>
<ContentType
Name="MyItems"
DisplayName="My items"
ItemType=" MyItemType ">
</ContentType>
<FileExtension Name=".abc" ContentType=" MyItems"/>
</ProjectSchemaDefinitions>
Ardından hedefler dosyasına şunları ekleyin:
<ItemGroup>
<PropertyPageSchema Include="MyProjectItemsSchema.xml"/>
</ItemGroup>
Örnek: $(VCTargetsPath)
\BuildCustomizations\masm.xml
Hata ayıklayıcı
Visual Studio'daki Hata Ayıklama hizmeti, Hata Ayıklama altyapısı için genişletilebilirliği destekler. Daha fazla bilgi için şu örneklere bakın:
Hata ayıklama oturumu için Hata ayıklama altyapılarını ve diğer özellikleri belirtmek için bir Hata Ayıklama BaşlatıcıSı MEF bileşeni uygulamanız ve bir debugger
kural eklemeniz gerekir. Örneğin, \1033\debugger_local_windows.xml dosyasına bakın $(VCTargetsPath)
.
Dağıtma
.vcxproj projeleri, Dağıtım Sağlayıcıları için Visual Studio Proje Sistemi genişletilebilirliğini kullanır.
Güncel denetim oluşturma
Varsayılan olarak derleme güncel denetimi, derleme sırasında tüm derleme girişleri ve çıkışları için .tlog okuma ve yazma .tlog dosyalarının $(TlogLocation)
oluşturulmasını gerektirir.
Özel bir güncel denetim kullanmak için:
Toolset.targets dosyasına özelliği ekleyerek
NoVCDefaultBuildUpToDateCheckProvider
varsayılan güncel denetimi devre dışı bırakın:<ItemGroup> <ProjectCapability Include="NoVCDefaultBuildUpToDateCheckProvider" /> </ItemGroup>
Kendi IBuildUpToDateCheckProvider'ınızı uygulayın.
Proje yükseltme
Varsayılan .vcxproj proje yükselticisi
Varsayılan .vcxproj proje yükselticisi , , ApplicationTypeRevision
MSBuild araç takımı sürümünü ve .NET Framework'leri değiştirirPlatformToolset
. Son ikisi her zaman Visual Studio sürüm varsayılanlarına değiştirilir, ancak PlatformToolset
ApplicationTypeRevision
özel MSBuild özellikleri tarafından denetlenebilir.
Yükseltici, bir projenin yükseltilip yükseltilmeyeceğine karar vermek için şu ölçütleri kullanır:
ve
ApplicationTypeRevision
öğesini tanımlayanApplicationType
projeler için, geçerli olandan daha yüksek düzeltme numarasına sahip bir klasör vardır.özelliği
_UpgradePlatformToolsetFor_<safe_toolset_name>
geçerli araç takımı için tanımlanır ve değeri geçerli araç takımına eşit değildir.Bu özellik adlarında, <safe_toolset_name> araç takımı adını, alfasayısal olmayan karakterlerin yerine bir alt çizgi (_) koyun.
Bir proje yükseltilebildiğinde Çözüm Yeniden Hedefleme'ye katılır. Daha fazla bilgi için bkz . IVsTrackProjectRetargeting2.
Projeler belirli bir araç takımını kullandığında Çözüm Gezgini proje adlarını donatmak istiyorsanız, bir _PlatformToolsetShortNameFor_<safe_toolset_name>
özellik tanımlayın.
ve _PlatformToolsetShortNameFor_<safe_toolset_name>
özellik tanımlarının örnekleri _UpgradePlatformToolsetFor_<safe_toolset_name>
için bkz. Microsoft.Cpp.Default.props dosyası. Kullanım örnekleri için bkz $(VCTargetPath)
\. Microsoft.Cpp.Platform.targets dosyası.
Özel proje yükseltici
Özel proje yükseltici nesnesi kullanmak için, burada gösterildiği gibi bir MEF bileşeni uygulayın:
/// </summary>
[Export("MyProjectUpgrader", typeof(IProjectRetargetHandler))]
[Export(typeof(IProjectRetargetHandler))]
[ExportMetadata("Name", "MyProjectUpgrader")]
[OrderPrecedence(20)]
[PartMetadata(ProjectCapabilities.Requires, ProjectCapabilities.VisualC)]
internal class MyProjectUpgrader: IProjectRetargetHandler
{
// ...
}
Kodunuz varsayılan .vcxproj yükseltici nesnesini içeri aktarabilir ve çağırabilir:
// ...
[Import("VCDefaultProjectUpgrader")]
// ...
IProjectRetargetHandler Lazy<IProjectRetargetHandler>
VCDefaultProjectUpgrader { get; set; }
// ...
IProjectRetargetHandler
Microsoft.VisualStudio.ProjectSystem.VS.dll içinde tanımlanır ve ile IVsRetargetProjectAsync
benzerdir.
VCProjectUpgraderObjectName
Proje sistemine özel yükseltici nesnenizi kullanmasını bildirmek için özelliğini tanımlayın:
<PropertyGroup>
<VCProjectUpgraderObjectName>MyProjectUpgrader</VCProjectUpgraderObjectName>
</PropertyGroup>
Proje yükseltmesini devre dışı bırakma
Proje yükseltmelerini devre dışı bırakmak için bir NoUpgrade
değer kullanın:
<PropertyGroup>
<VCProjectUpgraderObjectName>NoUpgrade</VCProjectUpgraderObjectName>
</PropertyGroup>
Proje önbelleği ve genişletilebilirliği
Visual Studio 2017'de büyük C++ çözümleriyle çalışırken performansı geliştirmek için proje önbelleği kullanıma sunulmuştur. Proje verileriyle doldurulmuş bir SQLite veritabanı olarak uygulanır ve ardından MSBuild veya CPS projelerini belleğe yüklemeden projeleri yüklemek için kullanılır.
önbellekten yüklenen .vcxproj projeleri için CPS nesnesi olmadığından, uzantının içeri aktaran UnconfiguredProject
veya ConfiguredProject
oluşturulamaz MEF bileşenleri. Genişletilebilirliği desteklemek için, Visual Studio bir projenin MEF uzantılarını kullanıp kullanmadığını (veya kullanma olasılığının yüksek olduğunu) algıladığında proje önbelleği kullanılmaz.
Bu proje türleri her zaman tamamen yüklenir ve bellekte CPS nesneleri olduğundan, bunlar için tüm MEF uzantıları oluşturulur:
Başlangıç projeleri
Özel proje yükselticisi olan projeler, yani bir
VCProjectUpgraderObjectName
özellik tanımlarlarMasaüstü Windows'ları hedeflemeyen projeler, yani bir
ApplicationType
özellik tanımlarPaylaşılan Öğeler projeleri (.vcxitems) ve .vcxitems projelerinin içeri aktarılmasıyla bunlara başvuran tüm projeler.
Bu koşullardan hiçbiri algılanırsa bir proje önbelleği oluşturulur. Önbellek, arabirimlerdeki sorguları VCProjectEngine
yanıtlamak get
için gereken MSBuild projesindeki tüm verileri içerir. Bu, bir uzantı tarafından yapılan MSBuild props ve targets dosya düzeyindeki tüm değişikliklerin önbellekten yüklenen projelerde çalışması gerektiği anlamına gelir.
Uzantınızı gönderme
VSIX dosyaları oluşturma hakkında bilgi için bkz . Visual Studio Uzantılarını Gönderme. Özel yükleme konumlarına dosya ekleme hakkında bilgi için, örneğin, altında $(VCTargetsPath)
dosya eklemek için bkz . Uzantılar klasörünün dışına yükleme.
Ek kaynaklar
Microsoft Derleme Sistemi (MSBuild), proje dosyaları için derleme altyapısını ve genişletilebilir XML tabanlı biçimi sağlar. Visual C++ proje sistemini genişletmek için temel MSBuild kavramları ve Visual C++ için MSBuild'in nasıl çalıştığı hakkında bilgi sahibi olmanız gerekir.
Yönetilen Genişletilebilirlik Çerçevesi (MEF), CPS ve Visual C++ proje sistemi tarafından kullanılan uzantı API'lerini sağlar. MEF'nin CPS tarafından nasıl kullanıldığına genel bakış için BKZ . MEF'nin VSProjectSystem genel bakış bölümünde CPS ve MEF.
Derleme adımları veya yeni dosya türleri eklemek için mevcut derleme sistemini özelleştirebilirsiniz. Daha fazla bilgi için bkz . MSBuild (Visual C++) Genel Bakış ve Proje özellikleriyle çalışma.