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:

Proje Özellik Sayfaları iletişim kutusundaki Platform Araç Takımı özelliği

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 Proje Platformu iletişim kutusundaki Yeni platform seçimi

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.targets

    Bu 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.props

    Microsoft derleyicilerini kullanan ve Windows'u hedefleyen araç kümeleri için varsayılanları ayarlar.

  • $(VCTargetsPath)\Microsoft.Cpp.WindowsSDK.props

    Bu 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 _ClCompilehedeflere bakarsanız, bunların doğrudan kendi başlarına hiçbir şey yapmadıklarını, bunun yerine gibi ClCompilediğer hedeflere bağlı olduklarını görürsünüz:

<Target Name="_ClCompile"
  DependsOnTargets="$(BeforeClCompileTargets);$(ComputeCompileInputsTargets);MakeDirsForCl;ClCompile;$(AfterClCompileTargets)" >
</Target>

ClCompileve 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:

  1. 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.

    • Kod görevi

  2. 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 CLolduğu gibi ve otomatik giriş ve çıkış dosyası izleme ile .tlog dosyası oluşturmak istiyorsanız, görevinizi sınıfından Microsoft.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ına TrackedVCToolTask 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:

  1. Toolset.targets dosyasına özelliği ekleyerek NoVCDefaultBuildUpToDateCheckProvider varsayılan güncel denetimi devre dışı bırakın:

    <ItemGroup>
      <ProjectCapability Include="NoVCDefaultBuildUpToDateCheckProvider" />
    </ItemGroup>
    
  2. Kendi IBuildUpToDateCheckProvider'ınızı uygulayın.

Proje yükseltme

Varsayılan .vcxproj proje yükselticisi

Varsayılan .vcxproj proje yükselticisi , , ApplicationTypeRevisionMSBuild 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:

  1. ve ApplicationTypeRevisionöğesini tanımlayan ApplicationType projeler için, geçerli olandan daha yüksek düzeltme numarasına sahip bir klasör vardır.

  2. ö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; }
// ...

IProjectRetargetHandlerMicrosoft.VisualStudio.ProjectSystem.VS.dll içinde tanımlanır ve ile IVsRetargetProjectAsyncbenzerdir.

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ımlarlar

  • Masaüstü Windows'ları hedeflemeyen projeler, yani bir ApplicationType özellik tanımlar

  • Paylaşı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.