WPF Uygulaması Derleme

Windows Presentation Foundation (WPF) uygulamaları .NET Framework yürütülebilir dosyaları (.exe), kitaplıklar (.dll) veya her iki derleme türünün birleşimi olarak oluşturulabilir. Bu konu başlığında WPF uygulamalarının nasıl derlendiği açıklanır ve derleme işlemindeki temel adımlar açıklanır.

WPF Uygulaması Oluşturma

WPF uygulaması aşağıdaki yollarla derlenebilir:

WPF Derleme İşlem Hattı

WPF projesi oluşturulduğunda, dile özgü ve WPF'ye özgü hedeflerin birleşimi çağrılır. Bu hedefleri yürütme işlemine derleme işlem hattı adı verilir ve temel adımlar aşağıdaki şekilde gösterilmiştir.

WPF build process

Derleme Öncesi Başlatmalar

Derlemeden önce, MSBuild aşağıdakiler de dahil olmak üzere önemli araçların ve kitaplıkların konumunu belirler:

  • The .NET Framework.

  • Windows SDK dizinleri.

  • WPF başvuru derlemelerinin konumu.

  • Derleme arama yollarının özelliği.

MSBuild'in derlemeler için arama yaptığı ilk konum başvuru derleme dizinidir (%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0\). Bu adım sırasında, derleme işlemi ayrıca çeşitli özellikleri ve öğe gruplarını başlatır ve gerekli temizleme çalışmalarını gerçekleştirir.

Başvuruları Çözümleme

Derleme işlemi, uygulama projesini derlemek için gereken derlemeleri bulur ve bağlar. Bu mantık görevde yer ResolveAssemblyReference alır. Proje dosyasında olarak Reference bildirilen tüm derlemeler, sistemde zaten yüklü olan derlemelerdeki arama yolları ve meta veriler hakkındaki bilgilerle birlikte göreve sağlanır. Görev derlemeleri arar ve yüklü derlemenin meta verilerini kullanarak çıkış bildirimlerinde görünmemesi gereken çekirdek WPF derlemelerini filtreler. Bu, ClickOnce bildirimlerinde yedekli bilgileri önlemek için yapılır. Örneğin PresentationFramework.dll, WPF için oluşturulmuş bir uygulamanın temsilcisi olarak kabul edilebildiğinden ve .NET Framework'ün yüklü olduğu her makinede tüm WPF derlemeleri aynı konumda bulunduğundan, bildirimlere tüm .NET Framework başvuru derlemeleriyle ilgili tüm bilgilerin eklenmesine gerek yoktur.

İşaretlemeyi Derleme—1'i Geç

Bu adımda, çalışma zamanının XML ayrıştırma ve özellik değerlerini doğrulamaya zaman harcamaması için XAML dosyaları ayrıştırılır ve derlenir. Derlenen XAML dosyası önceden belirteç haline getirildiğinden, çalışma zamanında yükleme işlemi XAML dosyasını yüklemekten çok daha hızlı olmalıdır.

Bu adım sırasında, derleme Page öğesi olan her XAML dosyası için aşağıdaki etkinlikler gerçekleşir:

  1. XAML dosyası, işaretleme derleyicisi tarafından ayrıştırılır.

  2. Bu XAML için derlenmiş bir gösterim oluşturulur ve obj\Release klasörüne kopyalanır.

  3. Yeni bir kısmi sınıfın CodeDOM gösterimi oluşturulur ve obj\Release klasörüne kopyalanır.

Ayrıca, her XAML dosyası için dile özgü bir kod dosyası oluşturulur. Örneğin, Visual Basic projesindeki bir Page1.xaml sayfası için page1.g.vb oluşturulur; C# projesindeki bir Page1.xaml sayfası için page1.g.cs oluşturulur. Dosya adındaki ".g" işareti, dosyanın biçimlendirme dosyasının üst düzey öğesi (veya WindowgibiPage) için kısmi sınıf bildirimine sahip kod oluşturulduğunu gösterir. Sınıfı C# içinde değiştiriciExtends (Visual Basic'te) ile partial bildirilir ve sınıfın başka bir yerde, genellikle Page1.xaml.cs arka planındaki kod dosyasında başka bir bildirimi olduğunu belirtir.

Kısmi sınıf, uygun temel sınıftan (örneğin Page bir sayfa için) genişletir ve arabirimini System.Windows.Markup.IComponentConnector uygular. Arabirimin IComponentConnector bir bileşeni başlatma ve içeriğindeki öğelere ad ve olay bağlama yöntemleri vardır. Sonuç olarak, oluşturulan kod dosyasının aşağıdaki gibi bir yöntem uygulaması vardır:

public void InitializeComponent() {
    if (_contentLoaded) {
        return;
    }
    _contentLoaded = true;
    System.Uri resourceLocater =
        new System.Uri(
            "window1.xaml",
            System.UriKind.RelativeOrAbsolute);
    System.Windows.Application.LoadComponent(this, resourceLocater);
}
Public Sub InitializeComponent() _

    If _contentLoaded Then
        Return
    End If

    _contentLoaded = True
    Dim resourceLocater As System.Uri = _
        New System.Uri("mainwindow.xaml", System.UriKind.Relative)

    System.Windows.Application.LoadComponent(Me, resourceLocater)

End Sub

Varsayılan olarak, işaretleme derlemesi MSBuild altyapısıyla aynı AppDomain şekilde çalışır. Bu, önemli performans kazançları sağlar. Bu davranış özelliğiyle AlwaysCompileMarkupFilesInSeparateDomain değiştirilebilir. Bu, ayrı AppDomainöğesini kaldırarak tüm başvuru derlemelerini kaldırma avantajına sahiptir.

İşaretlemeyi Derleme—Geçiş 2

İşaretlemeyi derlemenin 1. geçişinde tüm XAML sayfaları derlenmez. Yerel olarak tanımlanmış tür başvuruları (aynı projenin başka bir yerindeki kodda tanımlanan türlere başvurular) sahip XAML dosyaları şu anda derlemeden muaftır. Bunun nedeni, yerel olarak tanımlanan türlerin yalnızca kaynakta mevcut olması ve henüz derlenmemiş olmasıdır. Bunu belirlemek için ayrıştırıcı, işaretleme dosyasındaki gibi x:Name öğeleri aramayı içeren buluşsal yöntemler kullanır. Böyle bir örnek bulunduğunda, bu işaretleme dosyasının derlemesi kod dosyaları derlenene kadar ertelenmiş olur ve ardından ikinci işaretleme derlemesi bu dosyaları işler.

Dosya Sınıflandırma

Derleme işlemi, çıkış dosyalarını yerleştirilecekleri uygulama derlemesine göre farklı kaynak gruplarına yerleştirir. Tipik bir konumlanmamış uygulamada, olarak Resource işaretlenen tüm veri dosyaları ana derlemeye (yürütülebilir dosya veya kitaplık) yerleştirilir. UICulture Projede ayarlandığında, derlenmiş tüm XAML dosyaları ve özellikle dile özgü olarak işaretlenen kaynaklar uydu kaynak derlemesine yerleştirilir. Ayrıca, tüm dilden bağımsız kaynaklar ana derlemeye yerleştirilir. Derleme işleminin bu adımında bu belirleme yapılır.

ApplicationDefinitionProje dosyasındaki , Pageve Resource derleme eylemleri meta veriler (kabul edilebilir değerler true ve false) ile Localizable artırılabilir ve bu da dosyanın dile özgü mü yoksa dil nötr mü olduğunu belirler.

Çekirdek Derleme

Çekirdek derleme adımı kod dosyalarının derlenmesini içerir. Bu, Microsoft.CSharp.targets ve Microsoft.VisualBasic.targets dillerine özgü hedef dosyalarındaki mantık tarafından düzenlenmektedir. Buluşsal yöntemler, işaretleme derleyicisinin tek bir geçişinin yeterli olduğunu belirlediyse, ana derleme oluşturulur. Ancak, projedeki bir veya daha fazla XAML dosyasında yerel olarak tanımlanmış türlere başvurular varsa, işaretleme derlemesinin ikinci geçişi tamamlandıktan sonra son uygulama derlemelerinin oluşturulabilmesi için geçici bir .dll dosyası oluşturulur.

Bildirim Oluşturma

Derleme işleminin sonunda, tüm uygulama derlemeleri ve içerik dosyaları hazır olduktan sonra, uygulama için ClickOnce bildirimleri oluşturulur.

Dağıtım bildirim dosyası dağıtım modelini açıklar: geçerli sürüm, güncelleştirme davranışı ve yayımcı kimliği ve dijital imza. Bu bildirim, dağıtımı işleyen yöneticiler tarafından yazılması amaçlanmıştır. Dosya uzantısı .xbap (XAML tarayıcı uygulamaları (XBAP)) ve yüklü uygulamalar için .application'dır. İlki proje özelliği tarafından HostInBrowser dikte edilir ve sonuç olarak bildirim, uygulamayı tarayıcı tarafından barındırılan olarak tanımlar.

Uygulama bildirimi (bir .exe.manifest dosyası), uygulama derlemelerini ve bağımlı kitaplıkları açıklar ve uygulamanın gerektirdiği izinleri listeler. Bu dosyanın uygulama geliştiricisi tarafından yazılması amaçlanmıştır. Bir ClickOnce uygulamasını başlatmak için bir kullanıcı uygulamanın dağıtım bildirim dosyasını açar.

Bu bildirim dosyaları her zaman XBAP'ler için oluşturulur. Yüklü uygulamalar için, özelliği proje dosyasında değeriyle truebelirtilmediği sürece GenerateManifests oluşturulmaz.

XBAP'ler, tipik İnternet bölgesi uygulamalarına atanan bu izinler üzerinde ve üzerinde iki ek izin alır: WebBrowserPermission ve MediaPermission. WPF derleme sistemi, uygulama bildiriminde bu izinleri bildirir.

Artımlı Derleme Desteği

WPF derleme sistemi artımlı derlemeler için destek sağlar. İşaretleme veya kodda yapılan değişiklikleri algılama konusunda oldukça akıllıdır ve yalnızca değişiklikten etkilenen yapıtları derler. Artımlı derleme mekanizması aşağıdaki dosyaları kullanır:

  • Geçerli derleyici durumunu korumak için $(AssemblyName)_MarkupCompiler.Cache dosyası.

  • Yerel olarak tanımlanmış türlere başvurular içeren XAML dosyalarını önbelleğe almak için $(AssemblyName)_MarkupCompiler.lref dosyası.

Artımlı derlemeyi yöneten bir kural kümesi aşağıdadır:

  • Dosya, derleme sisteminin değişikliği algıladığı en küçük birimdir. Bu nedenle, bir kod dosyası için derleme sistemi bir türün değiştirilip değiştirilmediğini veya kodun eklenip eklenmediğini belirleyemez. Aynı durum proje dosyaları için de geçerlidir.

  • Artımlı derleme mekanizması, bir XAML sayfasının bir sınıfı tanımladığı veya diğer sınıfları kullandığından uyumlu olmalıdır.

  • Girdiler değişirse Reference , tüm sayfaları yeniden derleyin.

  • Bir kod dosyası değişirse, tüm sayfaları yerel olarak tanımlanmış tür başvuruları ile yeniden derleyin.

  • XAML dosyası değişirse:

    • XAML projede olarak Page bildirilirse: XAML'nin yerel olarak tanımlanmış tür başvuruları yoksa, XAML'nin yanı sıra yerel başvurulara sahip tüm XAML sayfalarını yeniden derleyin; XAML'de yerel başvurular varsa, tüm XAML sayfalarını yerel başvurularla yeniden derleyin.

    • XAML projede olarak ApplicationDefinition bildirilirse: tüm XAML sayfalarını yeniden derleyin (neden: her XAML'nin değişmiş olabilecek bir Application türe başvurusu vardır).

  • Proje dosyası bir kod dosyasını XAML dosyası yerine uygulama tanımı olarak bildirirse:

    • Proje dosyasındaki değerin ApplicationClassName değişip değişmediğini denetleyin (yeni bir uygulama türü var mı?). Öyleyse, uygulamanın tamamını yeniden derleyin.

    • Aksi takdirde, tüm XAML sayfalarını yerel başvurularla yeniden derle.

  • Proje dosyası değişirse: Önceki tüm kuralları uygulayın ve yeniden derlenmesi gerekenleri görün. Aşağıdaki özelliklerde yapılan değişiklikler tam bir yeniden derlemeyi tetikler: AssemblyName, IntermediateOutputPath, RootNamespaceve HostInBrowser.

Aşağıdaki yeniden derleme senaryoları mümkündür:

  • Uygulamanın tamamı yeniden derlenmiştir.

  • Yalnızca yerel olarak tanımlanmış tür başvuruları olan XAML dosyaları yeniden derlenir.

  • Hiçbir şey yeniden derlenmez (projedeki hiçbir şey değişmediyse).

Ayrıca bkz.