Windows 8 Çalışma Zamanı Modülü (WinRT / Windows Store uygulamaları / Windows 10 Universal App) Silverlight ve WPF ile nasıl karşılaştırılır? [kapalı]


353

Başımı Metro tarzı uygulamalar oluşturmak için kullanılan yeni Windows 8 Çalışma Zamanı etrafında döndürmeye çalışıyorum . XAML ile kullanabileceğinizi ve .NET tabanlı olduğunu biliyorum, böylece C # ve VB.NET uygulamaları yazmak için kullanılabilir, ancak daha sonra HTML, CSS, DOM ve JavaScript ile ilgili bir şey var gibi görünüyor.

Birisi bir .NET UI programcısının anlayabileceği açısından birkaç paragrafta ne olduğunu açıklayabilir mi? (Bunu anlamak için gerekli olan bir “anahtar” eksikim.)


WPF, Silverlight , Windows Forms vb.'nin en azından Intel sistemlerinde Windows 8 (ve Windows 10) altında çalışmaya devam edeceğini biliyoruz , bu yüzden lütfen bana şunu söyleme ...


22
.NET'e dayanmaz, sadece ona maruz kalır (biraz COM birlikte çalışma gibi, ama çok daha sorunsuz ... örneğin birlikte çalışma derlemeleri yok).
Pavel Minaev

WinRT'yi platform olarak mı (ABI, nesne modeli vb.) - bu durumda COM veya .NET ile karşılaştırmak daha mantıklı mı - yoksa UI için olanlar da dahil olmak üzere WinRT standart sınıf kitaplıkları hakkında mı soruyorsunuz?
Pavel Minaev

1
Temel teknolojiyi, nesne modelini vb. (Örn. COM'a benzer şekilde) ve bu teknoloji kullanılarak uygulanan belirli kütüphaneleri ayırt etmeniz gerektiğini unutmayın. İkincisi durumunda bile, tüm standart kütüphaneler UI kütüphaneleri değildir - VS'deki Nesne Tarayıcısına bakarsanız, Windows.*ad alanlarının kapsadığı özelliklerin genişliğini görebilirsiniz . Şimdiye kadar terminoloji burada biraz kafa karıştırıcıdır, çünkü WinRT hem teknolojiyi hem de tüm standart kütüphaneler grubunu ifade eder. Ben sadece UI kütüphaneleri ( Windows.UI.*) için herhangi bir özlü etiket olduğunu sanmıyorum .
Pavel Minaev

@TrueWill: Her üçünü de öğrenmek daha mantıklı, böylece bilginiz daha kapsamlı olacak ve böylece belirli bir sorun için hangi çözümün en iyi olduğuna karar verebilirsiniz. Sadece üçünden birini öğrenmeyin.
Chris Charabaruk

2
@TrueWill: Silverlight'ın gelecekteki sürümleri olmayacak: zdnet.com/blog/microsoft/microsoft-releases-silverlight-5/…
Sabuncu

Yanıtlar:


479

En düşük düzeyde, WinRT ABI düzeyinde tanımlanan bir nesne modelidir. Bir temel olarak COM kullanır (böylece her WinRT nesnesi uygular IUnknownve yeniden sayma yapar) ve oradan oluşturur. Çoğu doğrudan .NET'ten gelen eski COM ile karşılaştırıldığında oldukça fazla yeni kavram ekler - örneğin, WinRT nesne modelinin delegeleri vardır ve etkinlikler .NET tarzı yapılır (delegelerle ve abone ekle / kaldır yöntemler, etkinlik kaynakları ve lavabolar gibi eski COM modeli yerine). Dikkate değer diğer şeylerin yanı sıra WinRT'nin de parametreli ("jenerik") arayüzleri vardır.

Diğer bir büyük değişiklik, tüm WinRT bileşenlerinin, tıpkı .NET derlemeleri gibi meta verileri kullanabilmesidir. COM'da bunu tipelibler ile yapıyorsunuz, ancak her COM bileşeninde bunlara sahip değildiniz. WinRT için meta veriler .winmd dosyalarında bulunur - Geliştirici Önizlemesi'nde "C: \ Program Files (x86) \ Windows Kits \ 8.0 \ Windows Metada \" içine bakın. Etrafta konuşursanız, aslında kod içermeyen CLI meclisleri, sadece meta veri tabloları olduğunu göreceksiniz. Aslında onları ILDASM ile açabilirsiniz. Bu, WinRT'nin kendisinin yönetildiği anlamına gelmez - sadece dosya biçimini yeniden kullanır.

Sonra o nesne modeli açısından uygulanan bir dizi kütüphane vardır - WinRT arayüzlerini ve sınıflarını tanımlamak. Yine, orada ne olduğunu görmek için yukarıda belirtilen "Windows Meta Verileri" klasörüne bakın; ya da VS'de Object Browser'ı çalıştırın ve neyin kapsandığını görmek için çerçeve seçicide "Windows 8.0" ı seçin. Orada çok şey var ve tek başına UI ile ilgilenmiyor - Windows.Data.Jsonveya Windows.Graphics.Printing, veya gibi ad alanları da alıyorsunuz Windows.Networking.Sockets.

Sonra özellikle UI ile ilgilenen birkaç kütüphane elde edersiniz - çoğunlukla bunlar Windows.UIveya altında çeşitli ad alanları olacaktır Windows.UI.Xaml. Birçoğu WPF / Silverlight ad alanlarına çok benziyor - örn Windows.UI.Xaml.Controls. Yakından eşleşiyor System.Windows.Controls; Windows.UI.Xaml.Documentsvb. için aynen

Artık .NET, WinRT bileşenlerini .NET derlemeleriymiş gibi doğrudan başvuruda bulunabilir. Bu, COM Interop'tan farklı çalışır - birlikte çalışma derlemeleri, yalnızca /rbir .winmd dosyası gibi ara yapaylıklara ihtiyacınız yoktur ve meta verilerindeki tüm türler ve üyeleri .NET nesneleriymiş gibi görünür hale gelir. WinRT kitaplıklarının kendilerinin tamamen yerel olduğunu (ve WinRT kullanan yerel C ++ programlarının hiç CLR gerektirmediğini) unutmayın - yönetilen tüm bu şeyleri açığa çıkarmanın büyüsü CLR'nin içinde ve oldukça düşük seviyededir. Bir .winmd referans veren bir .NET programı ildasm, aslında bir extern montaj referansı gibi göreceksiniz - orada gömme türü gibi el hile çabukluğu yoktur.

Bu künt bir haritalama da değil - CLR, WinRT türlerini mümkünse eşdeğerlerine uyarlamaya çalışır. Yani mesela Guıd, tarihler ve URI'ler haline System.Guid, System.DateTimeve System.Urisırasıyla; Gibi WinRT toplama arayüzleri IIterable<T>ve IVector<T>olmak IEnumerable<T>ve IList<T>; ve bunun gibi. Bu her iki yöne de gider - uygulayan bir .NET nesneniz varsa IEnumerable<T>ve onu WinRT'ye geri iletirseniz, onu olarak görür IIterable<T>.

Sonuçta, bunun anlamı, .NET Metro uygulamalarınızın mevcut standart .NET kitaplıklarının bir alt kümesine ve ayrıca bazıları (özellikle) Windows.UISilverlight API'sine çok benzeyen (yerel) WinRT kitaplıklarına erişmesidir . Kullanıcı arayüzünüzü tanımlamak için hala XAML'niz var ve Silverlight'taki aynı temel kavramlarla ilgileniyorsunuz - veri bağlamaları, kaynaklar, stiller, şablonlar vb. Çoğu durumda, bir Silverlight uygulamasını sadece usingyeni ad alanlarıyla taşımak mümkündür , ve API'nın ayarlandığı kodda birkaç yerde ince ayar yapmak.

WinRT'nin kendisinin HTML ve CSS ile bir ilgisi yoktur ve JavaScript ile yalnızca .NET için nasıl yapıldığına benzer şekilde orada da bir anlam ifade eder. .NET Metro uygulamanızda WinRT UI kitaplıklarını kullandığınızda HTML / CSS / JS ile uğraşmanıza gerek yok (sanırım, gerçekten isterseniz, bir WebViewkontrol barındırabilirsiniz ...). Tüm .NET ve Silverlight becerileriniz bu programlama modelinde çok alakalı.


WPF-WinRT uyumluluğu ne olacak? WPF-Silverlight bir çeşit tutarsızlık olacak mı?
Den

5
@Den WPF burada iyi bir karşılaştırma noktası değildir - API Silverlight'a çok, çok daha yakındır. Bu şekilde bakarsanız, ikisi arasında tutarsızlıklar vardır, ancak ölçek masaüstüne WP7 Silverlight'a karşı değil, WP7 Silverlight'a daha yakındır.
Pavel Minaev

11
Mükemmel cevap. WinRT, NT çekirdeğine doğrudan erişiyor mu (işletim sistemi desteğine ihtiyaç duyduğunda) veya Win32 üzerinden mi gidiyor?
Timores


66

Gönderen Yapı keynote:

Açılış yığını

Hem HTML / CSS / JavaScript uygulamalarına hem de C # / XAML uygulamalarına ortak API'lar sağlıyorlar. C # ve XAML kullanılacak, ancak tam olarak WPF veya Silverlight olmayacak.


8
Yeni XAML nesnesi hem C # hem de (yerel) C ++ için mevcut olduğundan, bu biraz daha karmaşıktır. Ne WPF ne de Silverlight değil, ancak ikincisine çok yakın - açılışta gösterildiği gibi, mevcut Silverlight kodunda sadece bir grup kullanımı ve diğer önemsiz yeniden düzenlemeleri değiştirmekten genellikle kurtulabilirsiniz. WPF / Silverlight'ın ardındaki temel fikirler - bildirimsel işaretleme, kaynaklar, stiller, şablonlar, veri bağlamaları vb. Çoğu kontrol de orada.
Pavel Minaev

2
Bu sabah gördüğüm daha iyi bir grafik var, ama onu tekrar bulamıyorum. EDIT: Bu soruya başka bir cevap sayesinde bulundu. dougseven.files.wordpress.com/2011/09/win8-new-platform.png
Chris Charabaruk

1
WPF slayda nerede oturur?
paparazzo

1
Sağ altta .NET / Silverlight yolu ile birlikte gruplandırılmıştır.
BoltClock

1
Bu resim mevcut parçalar söz konusu olduğunda oldukça yanlıştır. "Windows Çekirdek Hizmetleri" ni "Win32 kernel32.dll" ve "Win32" ile "Win32 user32.dll + gdi32.dll" ile değiştirerek neredeyse düzeltebilirsiniz ... ancak IE ve .NET / Silverlight çoğunlukla üstte katmanlanmalıdır .32.dll + gdi32.dll dosyalarının yanı sıra C / C ++ / Java / Delphi / etc dosyaları da kernel32.dll dosyasına ulaşır. Önemli olan user32.dll ve gdi32.dll'nin WinRT'nin altında OLMAMASI ve Windows Mağazası Uygulamalarının WinRT'yi geçmişte kernel32.dll'nin tam gücüne ulaşamamasıdır.
Ben Voigt

37

Ana fikir şu anda iki geliştirme izi var - Masaüstü ve Metro.

  • Masaüstü, eski uygulamaların yaşadığı yerdir.
  • Yeni uygulama sınıfı olan Metro uygulamaları, VB.NET, C # veya C ++ dahil olmak üzere çeşitli şekillerde oluşturulabilir. Bu üç dil seçeneği, kullanıcı arayüzünü oluşturmak için XAML'yi kullanabilir. Alternatif, hem kullanıcı arayüzünün hem de uygulama kodunun geliştirilmesi için JavaScript / HTML5 / CSS kullanmaktır.

Bazı önemli noktalar:

  • Windows 8, yükseltilmiş bir cep telefonu işletim sistemi gibi hissediyor.
  • Metro'da, üst üste binen üst düzey pencereler yoktur, tıpkı bir cep telefonunda hiçbiri olmadığı gibi. MDI tarzı bir uygulama istiyorsanız, masaüstünde kalmanız gerekir.
  • Metro tarzı uygulamalar görünmediğinde otomatik olarak askıya alınır. Bu pil ömrünü uzatmak için yapıldı. Bu, kullanıcı onlarla etkileşimde olmasa bile arka plan işleme gerçekleştiren birçok masaüstü uygulamasının Metro'ya taşınmasının anlamlı olmayacağı anlamına gelir.
  • Windows 8'in ARM sürümü masaüstü uygulamalarını desteklemez. Bir uygulama yazmak istiyorsanız ve Windows'un herhangi bir sürümü üzerinde çalışmasını istiyorsanız, o zaman bir Metro uygulaması olması gerekir.

2
Metro'da, hiçbir örtüşen vardır üst düzey pencereleri. Hala var Popup( msdn.microsoft.com/en-us/library/windows/apps/… ), bu yüzden isterseniz MDI benzeri bir şey pişirebilirsiniz. Açıkçası, dokunma dostu olmayan bir kullanıcı arayüzü ile sonuçlanma riskiniz olduğundan kötüye kullanılması önerilmez.
Pavel Minaev

@Pavel - bu ilginç - bu, yan yana çalışan ancak üst üste binmeyen birkaç üst düzey pencereye sahip olabileceğiniz anlamına mı geliyor? örneğin döşenir ... örneğin ekranın yarısını paylaşıyor? Üzerinde çalıştığım WPF uygulamasının bu tür bir işlevselliğe ihtiyacı var.
dodgy_coder

3
Her Metro uygulamasının yalnızca bir üst düzey penceresi vardır. Yan yana çalışan iki Metro uygulamanız olabilir, ancak bu kullanıcının karar verdiği bir şeydir - uygulamanın kendini bu yapılandırmaya zorlaması mümkün değildir. Ayrıca, yan yana çalışan iki uygulamanız olsa bile, koordinasyon için iletişim kuramazlar ("Paylaş" gibi açık kullanıcı hareketleri hariç).
Pavel Minaev

1
Öte yandan, elbette, kendi tek üst düzey pencerenizi istediğiniz kadar alt bölüme ayırabilir ve bunları yeniden boyutlandırmak için hareketli bir bölücü sağlayabilirsiniz; . Yine de, uygulama değiştiricide tek bir şey olarak görüneceklerdi (ancak muhtemelen bunu istersiniz?).
Pavel Minaev

3
Martyn Lovell'e göre, bunun için kasıtlı bir mekanizma yoktur ve bunun için kullanılabilecek bazıları kasıtlı olarak kısıtlanmıştır. Adlandırılmış yöneltmeler, örneğin, bellek eşlemeli dosyalar yoktur. Soketler (sunucu soketleri dahil) vardır, ancak bağlanırken localhostyalnızca aynı uygulamaya bağlanabilirsiniz. Paylaşılan "bilinen klasörlerden" (Belgeler, Resimler vb.) Birinde normal dosyalar kullanabilirsiniz, ancak bu, yoklama gerektiren ve kullanıcı tarafından görülebilen oldukça kaba bir hack'tir.
Pavel Minaev

24

Mimarinin, şeylerin tam olarak nerede olduğunu anlamanıza yardımcı olacak değiştirilmiş bir sürümü var. Telerik ninjalarından biri CLR ekibi ile sohbet etti ve resmi değiştirdi:

Windows 8 Platformu ve Araçları (CLR dahil)

Burada CLR'nin nerede olduğunu görebilirsiniz. .NET çerçevesinin artık iki profili var

1- .NET Metro profili (Metro uygulamasıyla ilgilenen CLR)

2- .NET İstemci profili (C # ve VB.NET uygulamaları için CLR çalışma zamanı)

Umarım bu size daha net bir resim verir. Makalenin tamamını okuyun Kötü bir resim bin uzun tartışmaya değer. .


17

Burada Microsoft'tan çok fazla ayrıntı var .

Windows Çalışma Zamanı Modülü, API meta verileri (.winmd dosyaları) kullanılarak gösterilir. Bu, .NET çerçevesi tarafından kullanılan biçimdir (Ecma-335). Temeldeki ikili sözleşme, Windows Çalışma Zamanı API'larına doğrudan seçtiğiniz geliştirme dilinde erişmenizi kolaylaştırır. Windows Çalışma Zamanı API'larının şekli ve yapısı, hem C # gibi statik diller hem de JavaScript gibi dinamik diller tarafından anlaşılabilir. IntelliSense JavaScript, C #, Visual Basic ve C ++ dillerinde mevcuttur.

Kısacası, Windows Çalışma Zamanı, Windows işlevlerini gösteren ve JavaScript / C # / VB / C ++ için kullanılabilen yeni bir kitaplık kümesidir. Her dil, bazı thunking katmanından geçmek yerine onları doğrudan anlayabilmek ve arayabilmek için yapılmıştır.

Silverlight ve WPF, CLR üzerinde çalışan XAML aromalarıdır. Diğer işlevlerin yanı sıra, Windows Çalışma Zamanı Modülü, Silverlight'a çok benzeyen bir XAML sürümünü ortaya koyar, ancak bunu CLR aracılığıyla değil, yerel bir şekilde yapar. CLR'den değil, aynı zamanda C ++ 'dan da erişilebilir.


2
"Thunking katmanı" mevcut olabilir - örn. CLR aslında RCW kullanır - ancak şimdi bir uygulama detayıdır. Geliştirme perspektifinden, WinRT .winmd dosyalarına doğrudan başvurursunuz ve içindeki türlerle doğrudan çalışırsınız.
Pavel Minaev

3
Thunking katmanı RCW'leri kullanırken, windows çalışma zamanı için RCW'ler eski P / Invoke RCW'lerden daha hafiftir.
ReinstateMonica Larry Osterman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.