Kırpma seçenekleri

Aşağıdaki MSBuild özellikleri ve öğeleri kırpılmış kendi kendine dağıtımların davranışını etkiler. Seçeneklerden ILLinkbazıları, kırpmayı uygulayan temel aracın adı olan değerini ifade eder. Temel alınan araç hakkında daha fazla bilgi için, Düzeltici belgelerine bakın.

ile PublishTrimmed kırpma .NET Core 3.0'da kullanıma sunulmuştur. Diğer seçenekler yalnızca .NET 5 ve sonraki sürümlerde kullanılabilir.

Kırpmayı etkinleştirme

  • <PublishTrimmed>true</PublishTrimmed>

    Yayımlama sırasında kırpmayı etkinleştirin. Bu, kırpma uyumsuz özellikleri de kapatır ve derleme sırasında kırpma analizini etkinleştirir.

Dekont

Kırpmayı komut satırından etkin olarak belirtirseniz hata ayıklama deneyiminiz farklılık gösterir ve son üründe ek hatalarla karşılaşabilirsiniz.

Ayarın yalnızca dotnet publishyerine sırasında dotnet builduygulandığından emin olmak için bu ayarı proje dosyasına yerleştirin.

Bu ayar kırpmayı etkinleştirir ve varsayılan olarak tüm derlemeleri kırpacaktır. .NET 6'da, yalnızca aracılığıyla [AssemblyMetadata("IsTrimmable", "True")] kırpmayı kabul eden derlemeler varsayılan olarak kırpılır. kullanarak <TrimMode>partial</TrimMode>önceki davranışa dönebilirsiniz.

Bu ayar, kırpma için yapılandırılmış tüm derlemeleri kırpılır. Microsoft.NET.Sdk.NET 6'da bu, .NET çalışma zamanı derlemeleri için geçerli olan ile [AssemblyMetadata("IsTrimmable", "True")]tüm derlemeleri içerir. .NET 5'te, netcoreapp çalışma zamanı paketindeki derlemeler MSBuild meta verileri aracılığıyla <IsTrimmable> kırpma için yapılandırılır. Diğer SDK'lar farklı varsayılanlar tanımlayabilir.

Bu ayar ayrıca kırpma uyumluluğu Roslyn çözümleyicisini etkinleştirir ve kırpma ile uyumlu olmayan özellikleri devre dışı bırakır.

Kırpma ayrıntı düzeyi

TrimMode Kırpma ayrıntı düzeyini veya fullolarak ayarlamak için partial özelliğini kullanın. Konsol uygulamaları (ve .NET 8'den başlayarak Web SDK uygulamaları) için varsayılan ayar:full

<TrimMode>full</TrimMode>

Yalnızca kırpmayı kabul eden derlemeleri kırpmak için özelliğini olarak partialayarlayın:

<TrimMode>partial</TrimMode>

Kırpma modunu olarak partialdeğiştirirseniz, bir <TrimmableAssembly> MSBuild öğesi kullanarak tek tek derlemeleri kırpmaya kabul edebilirsiniz.

<ItemGroup>
  <TrimmableAssembly Include="MyAssembly" />
</ItemGroup>

Bu, derlemeyi oluştururken ayara [AssemblyMetadata("IsTrimmable", "True")] eşdeğerdir.

Aşağıdaki ayrıntı düzeyi ayarları, kullanılmamış IL'nin ne kadar agresif bir şekilde atılmış olduğunu denetler. Bu, tüm düzeltici giriş derlemelerini etkileyen bir özellik olarak veya özellik ayarını geçersiz kılan tek bir derlemedeki meta veriler olarak ayarlanabilir.

  • <TrimMode>link</TrimMode>

    Kullanılmayan üyeleri türlerden kaldıran üye düzeyinde kırpmayı etkinleştirin. .NET 6+ için varsayılan değer budur.

  • <TrimMode>copyused</TrimMode>

    Herhangi bir parçası kullanıldığında bütün bir derlemeyi tutan montaj düzeyi kırpmayı etkinleştirin (statik olarak anlaşılır bir şekilde).

Meta veri içeren <IsTrimmable>true</IsTrimmable> derlemeler ama açık TrimMode olmayan derlemeler genel TrimModekullanır. için varsayılan TrimMode değer .NET 6+ ve copyused önceki sürümlerdedirlink.Microsoft.NET.Sdk

Ek derlemeleri kırpma

.NET 6+'da, PublishTrimmed derlemeleri aşağıdaki derleme düzeyi özniteliğiyle kırpın:

[AssemblyMetadata("IsTrimmable", "True")]

Çerçeve kitaplıkları bu özniteliğe sahiptir. .NET 6+'da, derlemeyi ada göre belirterek (uzantı olmadan) bu öznitelik olmadan bir kitaplığı kırpmayı .dll da seçebilirsiniz.

Ayrı derlemeler için kırpma ayarları

Sdk, kırpılan bir uygulamayı yayımlarken, kırpma için işlenecek dosya kümesini temsil eden bir ItemGroup çağrı ManagedAssemblyToLink hesaplar. ManagedAssemblyToLink derleme başına kırpma davranışını denetleyebilen meta veriler olabilir. Bu meta verileri ayarlamak için, yerleşik PrepareForILLink hedef öncesinde çalışan bir hedef oluşturun. Aşağıdaki örnekte, kırpmanın nasıl etkinleştirileceği gösterilmektedir MyAssembly.

<Target Name="ConfigureTrimming"
        BeforeTargets="PrepareForILLink">
  <ItemGroup>
    <ManagedAssemblyToLink Condition="'%(Filename)' == 'MyAssembly'">
      <IsTrimmable>true</IsTrimmable>
    </ManagedAssemblyToLink>
  </ItemGroup>
</Target>

Bunu, ile [AssemblyMetadata("IsTrimmable", "True"])bir derlemeyi ayarlayarak <IsTrimmable>false</IsTrimmable> kitaplık yazarı tarafından belirtilen kırpma davranışını geçersiz kılmak için de kullanabilirsiniz.

SDK bu kümeyi yayımlama sırasında hesapladığı ve değişmemesini beklediği için öğesine/öğesinden ManagedAssemblyToLinköğe eklemeyin veya kaldırmayın. Desteklenen meta veriler:

  • <IsTrimmable>true</IsTrimmable>

    Verilen derlemenin kırpılıp kırpılmadığını denetler.

  • <TrimMode>copyused</TrimMode> veya <TrimMode>link</TrimMode>

    Bu derlemenin kırpma ayrıntı düzeyini kontrol edin. Bu, genel TrimMode'den önceliklidir. Bir derlemenin ayarlanması TrimMode anlamına gelir <IsTrimmable>true</IsTrimmable>.

  • <TrimmerSingleWarn>True</TrimmerSingleWarn> veya <TrimmerSingleWarn>False</TrimmerSingleWarn>

    Bu derleme için tek uyarıların gösterilip gösterilmeyeceğini denetler.

Kök derlemeler

Bir derleme kırpılmazsa "köklenmiş" olarak kabul edilir, bu da statik olarak anlaşılan tüm bağımlılıklarının tutulacağı anlamına gelir. Ek derlemeler ada göre "kök" olabilir (uzantı olmadan .dll ):

<ItemGroup>
  <TrimmerRootAssembly Include="MyAssembly" />
</ItemGroup>

Kök tanımlayıcılar

Çözümleme için kök belirtmenin bir diğer yolu da, düzeltici tanımlayıcı biçimini kullanan bir XML dosyası kullanmaktır. Bu, bütün bir derleme yerine belirli üyeleri kök oluşturmanızı sağlar.

<ItemGroup>
  <TrimmerRootDescriptor Include="MyRoots.xml" />
</ItemGroup>

Örneğin, MyRoots.xml uygulama tarafından dinamik olarak erişilen belirli bir yöntemin kökünü oluşturabilir:

<linker>
  <assembly fullname="MyAssembly">
    <type fullname="MyAssembly.MyClass">
      <method name="DynamicallyAccessedMethod" />
    </type>
  </assembly>
</linker>

Analiz uyarıları

  • <SuppressTrimAnalysisWarnings>false</SuppressTrimAnalysisWarnings>

    Kırpma analizi uyarılarını etkinleştirin.

Kırpma işlemi statik olarak erişilemeyen IL'yi kaldırır. Dinamik bağımlılıklar oluşturan yansıma veya diğer desenleri kullanan uygulamalar kırpılarak bozulabilir. Bu tür desenler hakkında uyarmak için olarak falseayarlayın<SuppressTrimAnalysisWarnings>. Bu, kendi kodunuz, kitaplık kodunuz ve çerçeve kodunuz da dahil olmak üzere uygulamanın tamamı hakkında uyarılar içerir.

Roslyn çözümleyicisi

PublishTrimmed.NET 6+ ayarı, sınırlı sayıda analiz uyarısı gösteren bir Roslyn çözümleyicisini de etkinleştirir. Çözümleyiciyi uygulamasından bağımsız olarak PublishTrimmedda etkinleştirebilir veya devre dışı bırakabilirsiniz.

  • <EnableTrimAnalyzer>true</EnableTrimAnalyzer>

    Kırpma analizi uyarılarının bir alt kümesi için Roslyn çözümleyicisini etkinleştirin.

Uyarıları gizleme

, , WarningsNotAsErrorsve TreatWarningsAsErrorsgibi NoWarnWarningsAsErrorsaraç zinciri tarafından dikkate alınan normal MSBuild özelliklerini kullanarak tek tek uyarı kodlarını gizleyebilirsiniz. ILLink hata olarak uyar davranışını bağımsız olarak denetleen ek bir seçenek vardır:

  • <ILLinkTreatWarningsAsErrors>false</ILLinkTreatWarningsAsErrors>

    ILLink uyarılarını hata olarak değerlendirin. Bu, derleyici uyarılarını genel olarak hata olarak ele alırken kırpma çözümleme uyarılarını hataya dönüştürmemek için yararlı olabilir.

Ayrıntılı uyarıları göster

.NET 6+'da kırpma analizi, bir derlemeden gelen her derleme için en fazla bir PackageReferenceuyarı üretir ve derlemenin iç bileşenlerinin kırpmayla uyumlu olmadığını belirtir. Ayrıca tüm derlemeler için ayrı ayrı uyarılar da gösterebilirsiniz:

  • <TrimmerSingleWarn>false</TrimmerSingleWarn>

    Derleme başına tek bir uyarıya daraltmak yerine tüm ayrıntılı uyarıları gösterin.

Simgeleri kaldırma

Simgeler genellikle kırpılan derlemelerle eşleşecek şekilde kırpılır. Tüm simgeleri de kaldırabilirsiniz:

  • <TrimmerRemoveSymbols>true</TrimmerRemoveSymbols>

    Kırpılan uygulamadan ekli PDB'ler ve ayrı PDB dosyaları da dahil olmak üzere simgeleri kaldırın. Bu, hem uygulama kodu hem de sembollerle birlikte gelen tüm bağımlılıklar için geçerlidir.

SDK, özelliğini DebuggerSupportkullanarak hata ayıklayıcısı desteğini devre dışı bırakmayı da mümkün kılar. Hata ayıklayıcısı desteği devre dışı bırakıldığında, kırpma simgeleri otomatik olarak kaldırır (TrimmerRemoveSymbols varsayılan olarak true olur).

Çerçeve kitaplığı özelliklerini kırpma

Çerçeve kitaplıklarının çeşitli özellik alanları, devre dışı bırakılan özelliklerin kodunu kaldırmayı mümkün hale getiren düzeltici yönergeleriyle birlikte gelir.

  • <AutoreleasePoolSupport>false</AutoreleasePoolSupport> (varsayılan)

    Desteklenen platformlarda otomatik sürüm havuzları oluşturan kodu kaldırın. Yönetilen iş parçacıkları için bkz. AutoreleasePool. Bu, .NET SDK'sı için varsayılandır.

  • <DebuggerSupport>false</DebuggerSupport>

    Daha iyi hata ayıklama deneyimleri sağlayan kodu kaldırın. Bu ayar simgeleri de kaldırır.

  • <EnableUnsafeBinaryFormatterSerialization>false</EnableUnsafeBinaryFormatterSerialization>

    BinaryFormatter serileştirme desteğini kaldırın. Daha fazla bilgi için bkz . BinaryFormatter serileştirme yöntemleri kullanımdan kaldırıldı.

  • <EnableUnsafeUTF7Encoding>false</EnableUnsafeUTF7Encoding>

    Güvenli olmayan UTF-7 kodlama kodunu kaldırın. Daha fazla bilgi için bkz . UTF-7 kod yolları kullanımdan kaldırıldı.

  • <EventSourceSupport>false</EventSourceSupport>

    EventSource ile ilgili kodu veya mantığı kaldırın.

  • <HttpActivityPropagationSupport>false</HttpActivityPropagationSupport>

    System.Net.Http için tanılama desteğiyle ilgili kodu kaldırın.

  • <InvariantGlobalization>true</InvariantGlobalization>

    Genelleştirmeye özgü kodu ve verileri kaldırın. Daha fazla bilgi için bkz . Sabit mod.

  • <MetadataUpdaterSupport>false</MetadataUpdaterSupport>

    Sık erişimli yeniden yüklemeyle ilgili meta veri güncelleştirmesine özgü mantığı kaldırın.

  • <StackTraceSupport>false</StackTraceSupport> (.NET 8+)

    Çalışma zamanı tarafından yığın izlemeleri (örneğin , Environment.StackTraceveya Exception.ToString) oluşturma desteğini kaldırın. Yığın izleme dizelerinden kaldırılacak bilgi miktarı diğer dağıtım seçeneklerine bağlı olabilir. Bu seçenek, hata ayıklayıcılar tarafından oluşturulan yığın izlemelerini etkilemez.

  • <UseNativeHttpHandler>true</UseNativeHttpHandler>

    Android/iOS için HttpMessageHandler'ın varsayılan platform uygulamasını kullanın ve yönetilen uygulamayı kaldırın.

  • <UseSystemResourceKeys>true</UseSystemResourceKeys>

    Derlemeler için System.* özel durum iletilerini şeritle. Bir System.* derlemeden özel durum oluşturulduğunda, ileti tam ileti yerine basitleştirilmiş bir kaynak kimliği olur.

Bu özellikler ilgili kodun kırpılmasına ve runtimeconfig dosyası aracılığıyla özelliklerin devre dışı bırakılmasına neden olur. İlgili çalışma zamanı yapılandırma seçenekleri de dahil olmak üzere bu özellikler hakkında daha fazla bilgi için bkz . özellik anahtarları. Bazı SDK'lar bu özellikler için varsayılan değerlere sahip olabilir.

Kırpma sırasında çerçeve özellikleri devre dışı bırakıldı

Aşağıdaki özellikler, statik olarak başvurulmayan bir kod gerektirdiğinden kırpma ile uyumsuzdur. Bunlar kırpılan uygulamalarda varsayılan olarak devre dışı bırakılır.

Uyarı

Bu özellikleri kendi riskinize göre etkinleştirin. Dinamik olarak başvurulmuş kodu korumak için ek çalışma yapmadan kırpılan uygulamaları kesme olasılığı yüksektir.

  • <BuiltInComInteropSupport>

    Yerleşik COM desteği devre dışı bırakıldı.

  • <CustomResourceTypesSupport>

    Özel kaynak türlerinin kullanımı desteklenmez. Özel kaynak türleri için yansıma kullanan ResourceManager kod yolları kırpılır.

  • <EnableCppCLIHostActivation>

    C++/CLI ana bilgisayar etkinleştirme devre dışı bırakıldı.

  • <EnableUnsafeBinaryFormatterInDesigntimeLicenseContextSerialization>

    DesigntimeLicenseContextSerializer serileştirme kullanımı BinaryFormatter devre dışı bırakıldı.

  • <StartupHookSupport>

    ile DOTNET_STARTUP_HOOKS daha önce Main kod çalıştırma desteklenmez. Daha fazla bilgi için bkz . konak başlatma kancası.