มันเป็นทรัพย์สินที่รวบรวมเวลา!
หนึ่งในสิ่งที่สำคัญที่สุดที่ควรทราบคือ "รุ่นเฉพาะ" เป็นคุณสมบัติที่มีผลบังคับใช้ในเวลารวบรวมและไม่ใช่เวลาใช้งานจริง
มันเกี่ยวกับอะไร?
เมื่อโครงการถูกสร้างขึ้นการอ้างอิงแอสเซมบลีของโครงการจะต้องได้รับการแก้ไขเพื่อหาส่วนประกอบทางกายภาพที่ระบบการสร้างควรใช้ หากการตรวจสอบ "รุ่นที่ระบุ" ดำเนินการ (ดูหัวข้อ "เมื่อใดที่" การตรวจสอบ "รุ่นที่เฉพาะเจาะจง") จะมีผลต่อผลลัพธ์ของกระบวนการแก้ปัญหาการชุมนุม:
- ระบบบิลด์จะหาตำแหน่งชุดฟิสิคัลที่สามารถใช้งานได้
- ระบบบิลด์จะเปรียบเทียบเวอร์ชันของชุดประกอบแบบฟิสิคัลกับรุ่นชุดประกอบที่เก็บไว้ในไฟล์. csproj สำหรับการอ้างอิงชุดประกอบ
- หากทั้งสองเวอร์ชันแอสเซมบลีเหมือนกันทุกอย่างกระบวนการแก้ไขปัญหาสำเร็จและฟิสิคัลแอสเซมบลีที่พบจะใช้สำหรับการสร้าง
- หากทั้งสองเวอร์ชันแอสเซมบลีไม่ตรงกันแอสเซมบลีทางกายภาพจะถูกละทิ้งและกระบวนการแก้ปัญหาดำเนินต่อไปโดยการค้นหาแอสเซมบลีที่อาจเกิดขึ้นถัดไป
- ถ้าไม่สามารถหาตำแหน่งฟิสิคัลที่เป็นไปได้อีกต่อไปกระบวนการแก้ไขปัญหาจะล้มเหลว ซึ่งส่งผลให้คำเตือนคอมไพเลอร์ (เตือน MSB3245) ที่บอกคุณว่าการอ้างอิงไม่สามารถแก้ไขได้
- ที่น่าสนใจคือการสร้างนั้นยังคงดำเนินต่อไป! ถ้ารหัสไม่มีการอ้างอิงจริงไปยังแอสเซมบลีบิลด์สำเร็จ (พร้อมคำเตือนที่กล่าวถึงก่อนหน้านี้) ถ้ารหัสมีการอ้างอิงบิลด์ล้มเหลวโดยมีข้อผิดพลาดที่ดูราวกับว่าโค้ดกำลังใช้ชนิดหรือเนมสเปซที่ไม่รู้จัก สิ่งบ่งชี้เพียงอย่างเดียวว่าทำไมบิลด์ที่ล้มเหลวจริงๆก็คือคำเตือน MSB3245
ลำดับที่แอสเซมบลีได้รับการแก้ไข
ลำดับที่กระบวนการแก้ไขปัญหาแอสเซมบลีหาตำแหน่งที่ตั้งแอสเซมบลีที่อาจเกิดขึ้นปรากฏเป็น:
- แอสเซมบลีที่อ้างอิงโดย
<HintPath>
องค์ประกอบในไฟล์. csproj
- เส้นทางผลลัพธ์ของโครงการ
- The GAC
โปรดทราบว่าหากมีแอสเซมบลีหลายรุ่นอยู่ใน GAC กระบวนการแก้ปัญหาจะพยายามแก้ไขแอสเซมบลีเป็นเวอร์ชันสูงสุดก่อน นี่เป็นสิ่งสำคัญเฉพาะในกรณีที่ไม่ได้ทำการตรวจสอบ
เมื่อมีการตรวจสอบ "เฉพาะรุ่น"
Visual Studio พิจารณาการตัดสินใจว่าจะทำการตรวจสอบ "เวอร์ชันเฉพาะ" บนข้อมูลสองชิ้นที่พบในไฟล์. csproj หรือไม่:
- การมีหรือไม่มี
<SpecificVersion>
องค์ประกอบและค่าของมัน (ถ้ามี)
- มีหรือไม่มีข้อมูลเวอร์ชันในการอ้างอิงชุดประกอบ
นี่เป็นลักษณะการอ้างอิงแอสเซมบลีทั่วไปที่มีข้อมูลเวอร์ชันเป็นอย่างไร:
<Reference Include="Foo, Version=1.2.3.4, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>True</SpecificVersion>
<HintPath>..\..\Bar\Foo.dll</HintPath>
</Reference>
และนี่คือลักษณะการอ้างอิงแอสเซมบลีที่ดูเหมือนไม่มีข้อมูลรุ่น:
<Reference Include="Foo">
[...]
ตารางต่อไปนี้จะแสดงเมื่อมีการตรวจสอบ "รุ่นที่ระบุ" และเมื่อไม่มี
| Version information
| Present Not present
----------------------------+------------------------------
<SpecificVersion> |
- Present, has value True | Yes (1) Yes (check always fails) (2)
- Present, has value False | No (3) No (4)
- Not present | Yes (5) No (6)
สิ่งที่น่าแปลกใจที่นี่คือไม่มีการตรวจสอบหากทั้งสองอย่าง<SpecificVersion>
และข้อมูลเวอร์ชั่นขาดหายไป (กรณีที่ 6) ฉันคาดว่าจะมีการตรวจสอบและจะล้มเหลวเสมอ (เช่นเดียวกับกรณีที่ 2) เนื่องจากในความเข้าใจของฉันการไม่มีการ<SpecificVersion>
บอกเป็นนัยถึงค่าเริ่มต้น "True" นี่อาจเป็นเรื่องแปลกสำหรับ Visual Studio 2010 ที่ฉันทำการทดสอบ
เมื่อคุณตรวจสอบคุณสมบัติของการอ้างอิงแอสเซมบลีใน Visual Studio UI (เลือกการอ้างอิงและกด F4), ค่าที่คุณเห็นสำหรับคุณสมบัติ "รุ่นที่เฉพาะเจาะจง" จะบอกคุณว่า Visual Studio กำลังจะทำการ "เวอร์ชั่นเฉพาะ" หรือไม่ ตรวจสอบ ในกรณีที่ 6 UI จะแสดง "True" แม้ว่า<SpecificVersion>
องค์ประกอบจะไม่ปรากฏในไฟล์. csproj
ผลข้างเคียงที่ "Copy local"
ถ้าคุณสมบัติ "คัดลอกภายในเครื่อง" ถูกตั้งค่าเป็น "จริง" แต่กระบวนการแก้ไขปัญหาแอสเซมบลีล้มเหลวเนื่องจากการตรวจสอบ "เฉพาะรุ่น" จะไม่มีการคัดลอกแอสเซมบลี
วัสดุอ้างอิง