Windows 8 Runtime (แอป WinRT / Windows Store / Windows 10 Universal App) เปรียบเทียบกับ Silverlight และ WPF อย่างไร [ปิด]


353

ฉันพยายามทำให้ Windows 8 Runtime รอบใหม่ของฉันถูกใช้เพื่อสร้างแอพสไตล์Metro ฉันรู้ว่าคุณสามารถใช้กับXAMLและเป็นไปตาม. NET ดังนั้น C # และ VB.NET สามารถใช้ในการเขียนแอพได้ แต่ดูเหมือนว่ามีบางอย่างที่เกี่ยวข้องกับ HTML, CSS, DOM และ JavaScript

ใครสามารถอธิบายสิ่งที่อยู่ในวรรคสองสามในแง่ที่โปรแกรมเมอร์ NET UI สามารถเข้าใจ? (ฉันหายไปบางสิ่งที่“ สำคัญ” ที่จำเป็นต้องเข้าใจ)


เราทุกคนรู้ว่า WPF, Silverlight , Windows Formsเป็นต้นจะทำงานภายใต้ Windows 8 (และ Windows 10) อย่างน้อยในระบบ Intel ดังนั้นโปรดอย่าบอกฉันว่า ...


22
มันไม่ได้ขึ้นอยู่กับ. NET เปิดเผยเฉพาะมัน (บิตเช่น COM interop แต่ราบรื่นมาก ... เช่นไม่มีการประกอบ interop)
Pavel Minaev

คุณกำลังขอให้ WinRT เป็นแพลตฟอร์ม (ABI, โมเดลวัตถุ ฯลฯ ) ซึ่งในกรณีนี้มันสมเหตุสมผลกว่าหรือเปรียบเทียบกับ COM หรือ .NET - หรือเกี่ยวกับไลบรารีคลาสมาตรฐานของ WinRT รวมถึง UI สำหรับคลาสหรือไม่
Pavel Minaev

1
โปรดทราบว่าคุณควรแยกความแตกต่างของเทคโนโลยีต้นแบบตัวแบบวัตถุ ฯลฯ - คล้ายกับเช่น COM - และไลบรารีเฉพาะที่นำมาใช้โดยใช้เทคโนโลยีนั้น แม้ในกรณีหลังไลบรารีมาตรฐานทั้งหมดไม่ใช่ไลบรารี UI - ถ้าคุณดูใน Object Browser ใน VS คุณสามารถดูคุณลักษณะที่กว้างที่Windows.*เนมสเปซครอบคลุมได้ คำศัพท์ที่ทำให้เกิดความสับสนอยู่ที่นี่เนื่องจาก WinRT อ้างถึงทั้งเทคโนโลยีและห้องสมุดมาตรฐานทั้งชุด ฉันไม่คิดว่าจะมีป้ายกำกับที่กระชับสำหรับไลบรารี UI ( Windows.UI.*) เท่านั้น
Pavel Minaev

@TrueWill: มันสมเหตุสมผลมากกว่าที่จะเรียนรู้ทั้งสามเพื่อให้ความรู้ของคุณมีความรอบรู้มากขึ้นและเพื่อให้คุณสามารถตัดสินใจได้ว่าทางออกใดดีที่สุดสำหรับปัญหาที่กำหนด อย่าเพิ่งเรียนรู้หนึ่งในสาม
Chris Charabaruk

2
@TrueWill: Silverlight จะไม่มีการเปิดตัวในอนาคต: zdnet.com/blog/microsoft/microsoft-releases-silverlight-5/…
Sabuncu

คำตอบ:


479

ที่ระดับต่ำสุด WinRT เป็นแบบจำลองวัตถุที่กำหนดไว้ในระดับ ABI มันใช้ COM เป็นฐาน (เพื่อให้วัตถุ WinRT ทุกเครื่องใช้IUnknownและทำการคำนวณใหม่) และสร้างจากที่นั่น มันเพิ่มแนวความคิดใหม่ ๆ จำนวนมากเมื่อเปรียบเทียบกับ COM ของเก่าซึ่งส่วนใหญ่มาจาก. NET โดยตรงตัวอย่างเช่นรูปแบบวัตถุ WinRT มีผู้รับมอบสิทธิ์และเหตุการณ์จะเสร็จสิ้นในรูปแบบ. NET (พร้อมตัวแทนและเพิ่ม / ลบสมาชิก วิธีการหนึ่งรายการต่อเหตุการณ์) แทนที่จะเป็น COM รุ่นเก่าของแหล่งเหตุการณ์และอ่างล้างมือ สิ่งที่น่าสังเกตอื่น ๆ WinRT ยังมีส่วนต่อประสาน ("ทั่วไป") อีกด้วย

การเปลี่ยนแปลงที่สำคัญอีกประการหนึ่งคือส่วนประกอบ WinRT ทั้งหมดมีข้อมูลเมตาสำหรับพวกเขาเช่นเดียวกับชุดประกอบ. NET ใน COM คุณ kinda sorta มีสิ่งนั้นกับ typelibs แต่ไม่ใช่ว่าทุกองค์ประกอบของ COM มีพวกเขา สำหรับ WinRT ข้อมูลเมตาจะอยู่ในไฟล์. winmd - ดูที่ "C: \ Program Files (x86) \ Windows Kits \ 8.0 \ Windows Metadata \" ในตัวอย่างผู้พัฒนา หากคุณแหย่ไปรอบ ๆ คุณจะเห็นว่าพวกเขาเป็นจริงประกอบ CLI ไม่มีรหัสเพียงตารางเม คุณสามารถเปิดได้ด้วย ILDASM อันที่จริง โปรดทราบว่านี่ไม่ได้หมายความว่า WinRT จะได้รับการจัดการ แต่เพียงแค่นำรูปแบบไฟล์กลับมาใช้ใหม่

จากนั้นก็มีห้องสมุดจำนวนหนึ่งที่นำไปใช้ในแง่ของรูปแบบวัตถุนั้นซึ่งกำหนดอินเทอร์เฟซและคลาส WinRT ดูที่โฟลเดอร์ "Windows Metadata" อีกครั้งเพื่อดูว่ามีอะไรอยู่ หรือเพียงแค่เรียกใช้ Object Browser ใน VS และเลือก "Windows 8.0" ในตัวเลือกเฟรมเวิร์กเพื่อดูสิ่งที่ครอบคลุม มีจำนวนมากอยู่ที่นั่นและมันก็ไม่ได้จัดการกับ UI คนเดียว - คุณยังได้รับ namespaces เช่นWindows.Data.JsonหรือหรือWindows.Graphics.PrintingWindows.Networking.Sockets

จากนั้นคุณจะได้รับห้องสมุดหลายอย่างซึ่งถูกโดยเฉพาะการจัดการกับ UI - ส่วนใหญ่เหล่านี้จะเป็น namespaces ต่างๆภายใต้หรือWindows.UI Windows.UI.Xamlมากของพวกเขามีความคล้ายกับ namespaces WPF / Silverlight - เช่นWindows.UI.Xaml.Controlsคือการจับคู่อย่างใกล้ชิดSystem.Windows.Controls; เหมือนกันWindows.UI.Xaml.Documentsเป็นต้น

ตอนนี้. NET มีความสามารถในการอ้างอิงองค์ประกอบ WinRT โดยตรงราวกับว่าพวกเขาเป็น. NET ประกอบ สิ่งนี้ทำงานแตกต่างจาก COM Interop - คุณไม่จำเป็นต้องใช้สิ่งประดิษฐ์ขั้นกลางใด ๆ เช่นแอสเซมบลี interop คุณเพียงแค่/rไฟล์. winmd และทุกประเภทและสมาชิกในเมตาดาต้าจะปรากฏให้คุณเห็นราวกับว่าพวกเขาเป็นวัตถุ. NET โปรดทราบว่าห้องสมุด WinRT นั้นเป็นเจ้าของภาษาอย่างสมบูรณ์ (และโปรแกรมภาษา C ++ ดั้งเดิมที่ใช้ WinRT ไม่จำเป็นต้องใช้ CLR เลย) - ความมหัศจรรย์ที่จะเปิดเผยสิ่งต่าง ๆ ทั้งหมดตามที่มีการจัดการอยู่ภายใน CLR และอยู่ในระดับค่อนข้างต่ำ หากคุณเป็น. NET โปรแกรม. NET ที่อ้างอิง. winmd คุณจะเห็นว่ามันดูเหมือนการอ้างอิงแอสเซมบลีภายนอก - ไม่มีการใช้กลอุบายมือเช่นประเภทการฝังที่นั่น

มันไม่ได้เป็นการทำแผนที่ทื่อเช่นกัน - CLR พยายามปรับประเภท WinRT ให้เทียบเท่ากับที่เป็นไปได้ ดังนั้น guid ของเช่นวันที่และยูริสกลายเป็นSystem.Guid, System.DateTimeและSystem.Uriตามลำดับ; ส่วนต่อประสานการเก็บ WinRT เช่นIIterable<T>และIVector<T>กลายเป็นIEnumerable<T>และIList<T>; และอื่น ๆ นี้ไปทั้งสองวิธี - ถ้าคุณมีวัตถุ NET ที่ดำเนินการIEnumerable<T>และผ่านมันกลับไป WinRT IIterable<T>ก็จะเห็นว่ามันเป็น

ท้ายที่สุดสิ่งนี้หมายความว่าแอป. NET Metro ของคุณจะเข้าถึงชุดย่อยของไลบรารี. NET มาตรฐานที่มีอยู่และไลบรารี WinRT (ดั้งเดิม) ซึ่งบางส่วนโดยเฉพาะอย่างยิ่งWindows.UIดูเหมือน Silverlight, API ที่ฉลาด คุณยังมี XAML เพื่อกำหนด UI ของคุณและคุณยังคงจัดการกับแนวคิดพื้นฐานเช่นเดียวกับใน Silverlight - การเชื่อมโยงข้อมูลทรัพยากรสไตล์แม่แบบและอื่น ๆ ในหลาย ๆ กรณีมันเป็นไปได้ที่จะพอร์ตแอป Silverlight เพียงแค่usingnamespaces ใหม่ และปรับแต่งโค้ดสองสามตำแหน่งที่มีการปรับ API

WinRT เองไม่มีส่วนเกี่ยวข้องกับ HTML และ CSS และมีความสัมพันธ์กับ JavaScript เฉพาะในแง่ที่ว่ามีการเปิดเผยเช่นเดียวกันกับวิธีที่ใช้กับ. NET คุณไม่จำเป็นต้องจัดการกับ HTML / CSS / JS เมื่อคุณใช้ไลบรารี WinRT UI ในแอป. NET Metro ของคุณ (ถ้าอย่างนั้นฉันว่าถ้าคุณต้องการจริงๆคุณสามารถโฮสต์การWebViewควบคุม ... ) ทักษะ. NET และ Silverlight ของคุณยังคงมีความเกี่ยวข้องอย่างมากในรูปแบบการเขียนโปรแกรมนี้


สิ่งที่เกี่ยวกับความเข้ากันได้ WPF-WinRT จะมีความไม่สอดคล้องกันของ WPF-Silverlight หรือไม่?
ชัด

5
@Den WPF ไม่ใช่จุดเปรียบเทียบที่ดีที่นี่ - API นั้นใกล้กับ Silverlight มาก หากคุณดูจากวิธีนั้นจะมีความไม่สอดคล้องกันระหว่างสองแบบนี้ แต่สเกลจะอยู่ใกล้กับเดสก์ท็อปกับ WP7 Silverlight ไม่ใช่ Silverlight และ WPF
Pavel Minaev

11
คำตอบที่ดี WinRT เข้าถึงเคอร์เนล NT โดยตรง (เมื่อต้องการการสนับสนุนระบบปฏิบัติการ) หรือผ่าน Win32?
Timores


66

จากคำปราศรัยBuild :

Keynote stack

พวกเขากำลังจัดหา API ทั่วไปให้กับทั้งแอป HTML / CSS / JavaScript และแอป C # / XAML จะใช้ C # และ XAML แต่จะไม่เป็น WPF หรือ Silverlight อย่างแน่นอน


8
สิ่งนี้เกี่ยวข้องกับอีกเล็กน้อยเนื่องจาก XAML thingy ใหม่มีให้สำหรับทั้ง C # และ C ++ (ดั้งเดิม) มันไม่ใช่ WPF หรือ Silverlight แต่ใกล้เคียงกับหลัง - ดังที่แสดงให้เห็นในประเด็นสำคัญคุณสามารถหนีไปได้ด้วยการเปลี่ยนการใช้งานจำนวนมากและการปรับโครงสร้างอื่น ๆ ที่น่าสนใจในรหัส Silverlight ที่มีอยู่ แนวคิดหลักที่อยู่เบื้องหลัง WPF / Silverlight - มาร์กอัปประกาศทรัพยากรสไตล์เทมเพลตการเชื่อมโยงข้อมูลและอื่น ๆ ล้วนอยู่ที่นั่น การควบคุมส่วนใหญ่ก็มีเช่นกัน
Pavel Minaev

2
มีภาพกราฟิกที่ดีกว่าที่ฉันเห็นเมื่อเช้านี้ แต่ฉันไม่สามารถหามันได้อีก แก้ไข: พบขอบคุณคำตอบสำหรับคำถามนี้ dougseven.files.wordpress.com/2011/09/win8-new-platform.png
Chris Charabaruk

1
WPF พอดีกับสไลด์ที่ใด
paparazzo

1
มันถูกจัดกลุ่มพร้อมกับ. NET / Silverlight ทางด้านล่างขวา
BoltClock

1
รูปภาพนั้นไม่ถูกต้องอย่างไม่มีนัยสำคัญเท่าที่ชิ้นส่วนที่มีอยู่มีความกังวล คุณเกือบจะสามารถแก้ไขได้โดยแทนที่ "Windows Kernel Services" ด้วย "Win32 kernel32.dll" และ "Win32" ด้วย "Win32 user32.dll + gdi32.dll" ... แต่ IE และ. NET / Silverlight ควรจะอยู่ด้านบนเป็นส่วนใหญ่ ของ user32.dll + gdi32.dll และผู้ที่เป็น C / C ++ / Java / Delphi / etc ยังเข้าถึงลงไป kernel32.dll สิ่งสำคัญคือ user32.dll และ gdi32.dll ไม่รองรับ WinRT และแอพ Windows Store ไม่สามารถเข้าถึง WinRT ที่ผ่านมาได้โดยตรงเพื่อให้เต็มพลังของ kernel32.dll
Ben Voigt

37

แนวคิดหลักคือตอนนี้มีแทร็กการพัฒนาสองแทร็ก - เดสก์ท็อปและเมโทร

  • เดสก์ท็อปเป็นที่ที่แอพเก่า ๆ ใช้งานอยู่
  • คลาสใหม่ของแอปพลิเคชัน, แอปพลิเคชัน Metro สามารถสร้างได้หลายวิธีรวมถึงโดย VB.NET, C # หรือ C ++ ตัวเลือกภาษาทั้งสามนี้สามารถใช้ XAML เพื่อสร้าง UI ทางเลือกคือใช้ JavaScript / HTML5 / CSS สำหรับการพัฒนาทั้ง UI และรหัสแอปพลิเคชัน

ประเด็นสำคัญบางประการ:

  • Windows 8 รู้สึกเหมือนเป็นระบบปฏิบัติการโทรศัพท์มือถือที่มีการลดอัตราการสุ่ม
  • ใน Metro ไม่มีหน้าต่างระดับบนสุดที่ทับซ้อนกันเหมือนกับที่ไม่มีในโทรศัพท์มือถือ หากคุณต้องการแอพพลิเคชั่นสไตล์ MDI คุณต้องอยู่บนเดสก์ท็อป
  • แอพสไตล์เมโทรจะถูกระงับโดยอัตโนมัติเมื่อมองไม่เห็น สิ่งนี้ทำเพื่อยืดอายุแบตเตอรี่ ซึ่งหมายความว่าจะไม่มีความหมายสำหรับแอปเดสก์ท็อปที่มีอยู่จำนวนมากซึ่งดำเนินการประมวลผลเบื้องหลังแม้ในขณะที่ผู้ใช้ไม่ได้โต้ตอบกับพวกเขา
  • รุ่น ARM ของ Windows 8 จะไม่รองรับแอปพลิเคชันเดสก์ท็อป ดังนั้นหากคุณต้องการเขียนแอพและต้องการให้มันทำงานบน Windows รุ่นใดก็ได้ต้องเป็นแอพ Metro

2
ใน Metro ไม่มีหน้าต่างระดับบนสุดที่ทับซ้อนกัน ยังคงมีอยู่Popup( msdn.microsoft.com/en-us/library/windows/apps/… ) ดังนั้นหากคุณต้องการคุณสามารถปรุงสิ่งที่เหมือน MDI เห็นได้ชัดว่าไม่แนะนำให้ใช้งานในทางที่ผิดเนื่องจากคุณเสี่ยงต่อการมี UI ที่ไม่เป็นมิตร
Pavel Minaev

@Pavel - น่าสนใจ - นั่นหมายความว่าคุณสามารถมีหน้าต่างระดับบนสุดสองบานวิ่งเคียงข้างกัน แต่ไม่ทับซ้อนกันใช่หรือไม่ เช่นปูกระเบื้อง ... การแชร์หน้าจอครึ่งหน้าจอแต่ละหน้า? แอป WPF ที่ฉันใช้งานอยู่ในตอนนี้ต้องการฟังก์ชันการทำงานประเภทนี้
dodgy_coder

3
แอพ Metro ทุกตัวมีหน้าต่างระดับบนสุดเพียงหน้าต่างเดียวเท่านั้น คุณสามารถมีแอพ Metro สองแอปติดกัน แต่นี่เป็นสิ่งที่ผู้ใช้ตัดสินใจ - ไม่มีวิธีใดที่แอพจะบังคับตัวเองให้เข้าสู่การกำหนดค่านี้ นอกจากนี้แม้ว่าคุณจะมีแอพสองตัวที่ทำงานเคียงข้างกัน แต่พวกเขาไม่สามารถสื่อสารเพื่อประสานงานได้ (ยกเว้นผ่านท่าทางของผู้ใช้ที่ชัดเจนเช่น "แชร์ถึง")
Pavel Minaev

1
ในอีกทางหนึ่งคุณสามารถแบ่งหน้าต่างระดับบนสุดของคุณเองออกเป็นหลาย ๆ พื้นที่ตามที่คุณต้องการและจัดให้มีตัวแบ่งที่เคลื่อนย้ายได้เพื่อปรับขนาดหน้าต่างเหล่านั้นซึ่งจากมุมมองของผู้ใช้ . พวกเขาจะยังคงปรากฏเป็นสิ่งเดียวในตัวสลับแอป แต่ (แต่คุณอาจต้องการมันได้หรือไม่)
Pavel Minaev

3
จากการกล่าวของ Martyn Lovell ไม่มีกลไกการพิจารณาอย่างรอบคอบสำหรับเรื่องนั้นและบางอย่างที่สามารถนำมาใช้เพื่อการนี้ได้ถูก จำกัด โดยเจตนา ไปป์ที่มีชื่อไม่ได้อยู่ที่นั่นตัวอย่างเช่นไม่มีไฟล์ที่แม็พหน่วยความจำ มีซ็อกเก็ต (รวมถึงซ็อกเก็ตเซิร์ฟเวอร์) แต่เมื่อเชื่อมต่อlocalhostคุณสามารถเชื่อมต่อกับแอปเดียวกันได้เท่านั้น คุณสามารถใช้ไฟล์ปกติในหนึ่งใน "โฟลเดอร์ที่รู้จัก" ที่ใช้ร่วมกัน (เอกสาร, รูปภาพและอื่น ๆ ) แต่นั่นเป็นแฮ็คที่ค่อนข้างหยาบซึ่งจำเป็นสำหรับการสำรวจและผู้ใช้สามารถมองเห็นได้
Pavel Minaev

24

มีเวอร์ชันดัดแปลงสถาปัตยกรรมที่แน่นอนจะช่วยให้คุณเข้าใจว่าสิ่งที่อยู่ หนึ่งในนินจา Telerik ได้สนทนากับทีมCLRและแก้ไขรูปภาพ:

แพลตฟอร์มและเครื่องมือ Windows 8 (รวมถึง CLR)

ที่นี่คุณสามารถเห็นตำแหน่ง CLR ขณะนี้. NET Framework มีสองโปรไฟล์

1-. NET Metro profile (CLR ที่จัดการกับแอปพลิเคชัน Metro)

2- โปรไฟล์ไคลเอนต์. NET (รันไทม์ CLR สำหรับแอปพลิเคชัน C # และ VB.NET)

ฉันหวังว่านี่จะให้ภาพที่ชัดเจนขึ้น อ่านบทความเต็มรูปแบบในภาพที่ไม่ดีมีค่าการอภิปรายนานพัน .


17

จำนวนมากของรายละเอียดจาก Microsoft ที่นี่

Windows Runtime ถูกเปิดเผยโดยใช้ API ข้อมูลเมตา (ไฟล์. winmd) นี่เป็นรูปแบบเดียวกับที่ใช้โดย. NET Framework (Ecma-335) สัญญาไบนารีพื้นฐานช่วยให้คุณเข้าถึง Windows Runtime API ได้โดยตรงในภาษาที่คุณเลือก รูปร่างและโครงสร้างของ Windows Runtime API สามารถเข้าใจได้ทั้งภาษาคงที่เช่นภาษา C # และภาษาไดนามิกเช่น JavaScript IntelliSense ให้บริการใน JavaScript, C #, Visual Basic และ C ++

ในระยะสั้น Windows Runtime เป็นชุดของไลบรารีใหม่ที่เปิดเผยฟังก์ชันการทำงานของ Windows และพร้อมใช้งานกับ JavaScript / C # / VB / C ++ แต่ละภาษาได้รับการทำความเข้าใจและสามารถเรียกได้โดยตรงแทนที่จะต้องผ่านเลเยอร์บาง ๆ

Silverlight และ WPF เป็นรสชาติของ XAML ที่ทำงานบน CLR ท่ามกลางฟังก์ชั่นอื่น ๆ Windows Runtime แสดง XAML รุ่นหนึ่งคล้ายกับ Silverlight แต่ทำในลักษณะดั้งเดิมไม่ใช่ผ่าน CLR สามารถเข้าถึงได้จาก CLR แต่ยังมาจาก C ++


2
"เลเยอร์ thunking" อาจปรากฏ - เช่น CLR ใช้ RCW จริง - แต่มันเป็นรายละเอียดการนำไปปฏิบัติ จากมุมมองของนักพัฒนาคุณอ้างอิงไฟล์ WinRT .winmd โดยตรงและทำงานกับประเภทภายในได้โดยตรง
Pavel Minaev

3
ในขณะที่เลเยอร์ thunking ใช้ RCWs, RCWs สำหรับรันไทม์ของ windows จะมีน้ำหนักเบากว่า RCW P / Invoke เก่า
ReinstateMonica Larry Osterman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.