อะไรคือความแตกต่างระหว่างโครงการที่ใช้ร่วมกันและไลบรารีคลาสใน Visual Studio 2015


240

ฉันกำลังดูคุณสมบัติใหม่สำหรับ Visual Studio 2015 และโครงการที่ใช้ร่วมกันเกิดขึ้นมากมาย แต่ฉันไม่เข้าใจว่ามันแตกต่างจากการใช้ Class Library หรือ Portable Class Library อย่างไร มีใครอธิบายได้บ้าง

แก้ไข:โครงการที่ใช้ร่วมกันเป็นคุณลักษณะใหม่ใน Visual Studio 2015 และแตกต่างจาก Portable Class Library ฉันเข้าใจว่า Portable Class Library คืออะไร สิ่งที่ฉันพยายามเข้าใจคือโครงการที่ใช้ร่วมกันแตกต่างกับไลบรารีคลาสอย่างไร ดูลิงค์ด้านล่าง

http://www.c-sharpcorner.com/UploadFile/7ca517/shared-project-an-impressive-features-of-visual-studio-201/


คำตอบ:


238

ความแตกต่างระหว่างโปรเจ็กต์ที่แชร์และไลบรารีคลาสคือคอมไพล์หลังถูกคอมไพล์และหน่วยของการใช้ซ้ำคือแอสเซมบลี

ในขณะที่กับอดีตหน่วยการใช้ซ้ำคือซอร์สโค้ดและรหัสที่ใช้ร่วมกันจะรวมอยู่ในแต่ละแอสเซมบลีที่อ้างอิงโครงการที่ใช้ร่วมกัน

สิ่งนี้มีประโยชน์เมื่อคุณต้องการสร้างชุดประกอบแยกต่างหากที่กำหนดเป้าหมายแพลตฟอร์มเฉพาะแต่ยังคงมีรหัสที่ควรแชร์

ดูที่นี่ :

การอ้างอิงโครงการที่ใช้ร่วมกันจะแสดงภายใต้โหนดอ้างอิงใน Solution Explorer แต่รหัสและเนื้อหาในโครงการที่ใช้ร่วมกันจะได้รับการปฏิบัติเสมือนว่าเป็นไฟล์ที่เชื่อมโยงกับโครงการหลัก


ใน Visual Studio 1เวอร์ชันก่อนหน้าคุณสามารถแบ่งปันซอร์สโค้ดระหว่างโครงการโดยเพิ่ม -> รายการที่มีอยู่แล้วเลือกลิงก์ แต่นี่เป็นชนิดของ clunky และแต่ละไฟล์ต้นฉบับแยกกันต้องเลือกทีละไฟล์ ด้วยการย้ายไปสนับสนุนแพลตฟอร์มที่แตกต่างหลากหลาย (iOS, Android, ฯลฯ ) พวกเขาตัดสินใจที่จะทำให้ง่ายต่อการแบ่งปันแหล่งที่มาระหว่างโครงการโดยการเพิ่มแนวคิดของโครงการที่ใช้ร่วมกัน


1คำถามนี้และคำตอบของฉัน (จนถึงตอนนี้) แนะนำว่าโครงการที่ใช้ร่วมกันเป็นคุณสมบัติใหม่ใน Visual Studio 2015 ที่จริงแล้วพวกเขาเปิดตัวในVisual Studio 2013 Update 2


1
สมมติว่ามีสองโครงการที่อ้างอิงโครงการที่ใช้ร่วมกันเดียวกัน หากหนึ่งในนั้นเพิ่มการอ้างอิงไปยังอีกคุณจะได้รับข้อผิดพลาดการประกาศประเภทซ้ำ
ซาด Saeeduddin

3
@ Asad - ฉันยังไม่ได้ตรวจสอบ แต่คาดว่าจะไม่ คุณสามารถมีสองประเภทที่แตกต่างด้วยชื่อเดียวกันและประกาศในเนมสเปซเดียวกัน แต่มีอยู่ในแอสเซมบลีที่แตกต่างกัน นั่นไม่ใช่ข้อผิดพลาด
Damien_The_Unbeliever

ฉันมีคำถามเดียวกันกับ OP ในปี 2560 แต่เนื่องจากเรามี. net standard 2.0อยู่แล้ว ตอนนี้โครงการที่ใช้ร่วมกันไม่ล้าสมัยหรือไม่ หากคุณต้องการสร้างแอปพลิเคชันเว็บหรือแอปใหม่ล่าสุดในวันนี้
JP Hellemons

1
@JPHellemons -. net standard ดี - แต่ถ้าคุณต้องการออกไปข้างนอกด้วยเหตุผลใด ๆ ก็ตาม (เช่นหากมีฟังก์ชั่นการใช้งานเฉพาะบนแพลตฟอร์มเฉพาะ ) โครงการที่ใช้ร่วมกันอาจยังคงเป็นแนวทางที่ดี
Damien_The_Unbeliever

1
เราพูดกับโปรเจ็กต์ที่แชร์เราสามารถแชร์ไฟล์ Javascript ได้ เราจะใช้สิ่งนั้นใน bundleConfig ได้อย่างไร?
Leth

34

ฉันพบข้อมูลเพิ่มเติมจากบล็อกนี้

  • ในไลบรารีคลาสเมื่อมีการคอมไพล์รหัสแอสเซมบลี (dll) ถูกสร้างขึ้นสำหรับแต่ละไลบรารี แต่ด้วยโครงการที่ใช้ร่วมกันมันจะไม่มีข้อมูลส่วนหัวใด ๆ ดังนั้นเมื่อคุณมีการอ้างอิงโครงการที่ใช้ร่วมกันมันจะถูกรวบรวมเป็นส่วนหนึ่งของแอปพลิเคชันหลัก จะไม่มีการสร้าง Dll แยกต่างหาก
  • ในไลบรารี่ของคลาสคุณจะได้รับอนุญาตให้เขียนโค้ด C # ในขณะที่โปรเจ็กต์ที่แชร์สามารถมีอะไรก็ได้เช่นไฟล์โค้ด C # ไฟล์ XAML หรือไฟล์ JavaScript เป็นต้น

7
ไลบรารีคลาสสามารถมี. xaml ได้เช่นกัน (การควบคุมผู้ใช้)
ค่าเริ่มต้น

21

ความแตกต่างในระยะสั้นคือ

1) PCL จะไม่มีสิทธิ์เข้าถึงแบบเต็มของ. NET Framework โดยที่ SharedProject มี

2) #ifdef สำหรับรหัสเฉพาะแพลตฟอร์ม - คุณไม่สามารถเขียนใน PCL ( #ifdef ตัวเลือกไม่สามารถใช้ได้กับคุณใน PCL เนื่องจากมีการรวบรวมแยกต่างหากเป็น DLL ของตัวเองดังนั้นในเวลาคอมไพล์ (เมื่อประเมิน #ifdef) ไม่ทราบว่าแพลตฟอร์มใดที่จะเป็นส่วนหนึ่งของ ) ในฐานะที่คุณสามารถทำโครงการแชร์ได้

3) รหัสเฉพาะแพลตฟอร์มสามารถทำได้โดยใช้ Inversion Of Control ใน PCL โดยที่ #ifdef ใช้คำสั่งที่คุณสามารถทำได้เหมือนกันใน Shared Project

บทความที่ยอดเยี่ยมซึ่งแสดงให้เห็นถึงความแตกต่างระหว่าง PCL กับโครงการที่ใช้ร่วมกันสามารถดูได้ที่ลิงค์ต่อไปนี้

http://hotkrossbits.com/2015/05/03/xamarin-forms-pcl-vs-shared-project/


18

เหมือนคนอื่น ๆ ที่เขียนไว้แล้วโดยย่อ:

โครงการที่ใช้ร่วมกัน
นำมาใช้ใหม่ในระดับรหัส (ไฟล์) ช่วยให้โครงสร้างโฟลเดอร์และทรัพยากรเช่นกัน

pcl
นำมาใช้ใหม่ในระดับการชุมนุม

สิ่งที่ขาดหายไปจากคำตอบสำหรับฉันที่นี่ส่วนใหญ่คือข้อมูลเกี่ยวกับการทำงานที่ลดลงที่มีอยู่ใน PCL: เป็นตัวอย่างที่คุณมีการดำเนินงานไฟล์ที่ จำกัด

ในรายละเอียด
โครงการที่ใช้ร่วมกัน :
+ สามารถใช้ #if เมื่อกำหนดเป้าหมายหลายแพลตฟอร์ม (เช่น Xamarin iOS, Android, WinPhone)
+ ฟังก์ชั่นกรอบทั้งหมดที่มีอยู่สำหรับโครงการเป้าหมายแต่ละ (แม้ว่าจะต้องมีการรวบรวมตามเงื่อนไข)
o รวมที่รวบรวมเวลา
- ขนาดขนาดใหญ่ขึ้นเล็กน้อย ของแอสเซมบลีที่เป็นผลลัพธ์
- ต้องการ Visual Studio 2013 Update 2 ขึ้นไป

pcl :
+ สร้างแอสเซมบลีที่ใช้ร่วมกัน
+ ใช้งานได้กับ Visual Studio รุ่นเก่า (อัปเดตก่อน 2013 2)
o การเชื่อมโยงแบบไดนามิก
- ฟังก์ชัน lmited (ชุดย่อยของโครงการทั้งหมดที่ถูกอ้างอิงโดย)

หากคุณมีทางเลือกฉันจะแนะนำให้ไปทำโปรเจ็กต์ที่ใช้ร่วมกันโดยทั่วไปจะมีความยืดหยุ่นและมีประสิทธิภาพมากกว่า หากคุณทราบความต้องการของคุณล่วงหน้าและ PCL สามารถตอบสนองความต้องการของคุณได้คุณอาจไปที่เส้นทางนั้นเช่นกัน PCL ยังบังคับให้แยกชัดเจนโดยไม่อนุญาตให้คุณเขียนรหัสเฉพาะแพลตฟอร์ม (ซึ่งอาจไม่ใช่ทางเลือกที่ดีที่จะใส่ในแอสเซมบลีที่ใช้ร่วมกันตั้งแต่แรก)

จุดสนใจหลักของทั้งสองคือเมื่อคุณกำหนดเป้าหมายหลายแพลตฟอร์มมิฉะนั้นคุณจะใช้เพียงโครงการไลบรารี / dll ปกติ


9

จากหนังสือVS 2015 ประสบความสำเร็จ

โครงการที่ใช้ร่วมกันช่วยให้รหัสการแชร์สินทรัพย์และทรัพยากรในหลายประเภทโครงการ โดยเฉพาะอย่างยิ่งประเภทโครงการต่อไปนี้สามารถอ้างอิงและใช้โครงการที่ใช้ร่วมกันได้:

  • Console, Windows Forms และ Windows Presentation Foundation
  • แอพ Windows Store 8.1 และแอพ Windows Phone 8.1
  • แอพ Windows Phone 8.0 / 8.1 Silverlight
  • ไลบรารีคลาสแบบพกพา

หมายเหตุ: - ทั้งโครงการที่ใช้ร่วมกันและไลบรารีคลาสแบบพกพา (PCL) อนุญาตให้ใช้รหัสการแชร์ทรัพยากร XAML และสินทรัพย์ แต่แน่นอนว่ามีความแตกต่างบางประการที่อาจสรุปได้ดังนี้

  • โครงการที่ใช้ร่วมกันไม่ได้ผลิตแอสเซมบลีที่นำมาใช้ซ้ำได้ดังนั้นจึงสามารถใช้ได้จากภายในโซลูชันเท่านั้น
  • โปรเจ็กต์ที่แบ่งใช้มีการสนับสนุนโค้ดเฉพาะแพล็ตฟอร์มเนื่องจากสนับสนุนตัวแปรสภาวะแวดล้อมเช่น WINDOWS_PHONE_APP และ WINDOWS_APP ที่คุณสามารถใช้เพื่อตรวจสอบว่าแพล็ตฟอร์มของคุณกำลังทำงานอยู่
  • ในที่สุดโครงการที่ใช้ร่วมกันไม่สามารถพึ่งพาห้องสมุดบุคคลที่สามได้
  • จากการเปรียบเทียบ PCL สร้างไลบรารี. dll ที่นำมาใช้ซ้ำได้และสามารถมีการอ้างอิงกับไลบรารีบุคคลที่สามได้ แต่ไม่สนับสนุนตัวแปรสภาพแวดล้อมแพลตฟอร์ม

7

ไลบรารีคลาสถูกคอมไพล์รหัสที่ใช้ร่วมกัน

โครงการที่ใช้ร่วมกันเป็นรหัสที่มาที่ใช้ร่วมกัน

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