แม้ว่าฉันจะมีกรณีเฉพาะ แต่ฉันก็สงสัยเกี่ยวกับสถานการณ์ทั่วไป
สามารถเพิ่ม DLLs สองรายการเมื่ออ้างอิงกับโครงการ Visual C # ชนกันเพื่อป้องกันไม่ให้โซลูชันสร้างได้หรือไม่ หากเป็นกรณีนี้มีวิธีใดบ้างที่เป็นไปได้ที่จะบรรเทาปัญหานี้
แม้ว่าฉันจะมีกรณีเฉพาะ แต่ฉันก็สงสัยเกี่ยวกับสถานการณ์ทั่วไป
สามารถเพิ่ม DLLs สองรายการเมื่ออ้างอิงกับโครงการ Visual C # ชนกันเพื่อป้องกันไม่ให้โซลูชันสร้างได้หรือไม่ หากเป็นกรณีนี้มีวิธีใดบ้างที่เป็นไปได้ที่จะบรรเทาปัญหานี้
คำตอบ:
เป็นไปได้มาก
หากคุณกำหนดเนมสเปซและชื่อประเภทที่เหมือนกันในแอสเซมบลีที่แตกต่างกัน (หรือในโครงการของคุณและแอสเซมบลีที่เพิ่ม) คุณจะได้รับความขัดแย้งกับรหัสใด ๆ ที่พยายามใช้หนึ่งหรือประเภทอื่น
หากคุณแน่ใจว่าคุณมีเนมสเปซที่ไม่เหมือนใครเช่นเดียวกับการอ้างอิงของคุณคุณจะไม่มีปัญหานี้
ความเป็นไปได้อีกอย่างหนึ่งเกี่ยวข้องกับการพึ่งพาเวอร์ชันต่าง ๆ - ถ้าโครงการของคุณใช้ (ตัวอย่าง) ไลบรารีการบันทึกที่เวอร์ชัน 1.2 แต่แอสเซมบลีที่เพิ่มเข้ามานั้นมีการอ้างอิงในแอสเซมบลีเดียวกัน แต่เวอร์ชันที่แตกต่างกัน หรือชุดประกอบที่เพิ่มได้รับการกำหนดค่า / สร้างเพื่อใช้รุ่นที่เฉพาะเจาะจงคุณจะได้รับความขัดแย้งและการสร้างจะล้มเหลว
ทั้งปัญหาเหล่านี้สามารถแก้ไขได้โดยใช้ชื่อแทนการชุมนุมตามที่อธิบายไว้ที่นี่
เมื่อเห็นว่าไม่มีใครพูดถึงเรื่องนี้คุณถามว่า:
อะไรคือวิธีที่เป็นไปได้ในการลดสิ่งนี้
มีวิธีแก้ปัญหาที่สะอาดสำหรับกรณีนี้โดยไม่มีข้อ จำกัด และไม่มีวิธีแก้ไขปัญหาที่น่ารำคาญ คุณสามารถกำหนด Assembly alises เพื่อให้คอมไพเลอร์รู้ว่าจะอ้างอิงอะไรในตำแหน่งที่ถูกต้อง
ดูhttp://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx
ใช่มันเป็นไปได้มาก
สมมติว่าคุณเพิ่มการอ้างอิงถึง DLL บางตัวซึ่งใช้ Lucene.Net เวอร์ชันเก่าและคุณต้องการรวมเวอร์ชันล่าสุด
คุณสามารถแก้ปัญหานี้ได้โดยใช้นามแฝงภายนอก: http://msdn.microsoft.com/en-us/library/ms173212.aspx
คุณสามารถใส่แอสเซมบลีเวอร์ชันต่าง ๆ ได้มากเท่าที่คุณต้องการในGlobal Assembly Cacheโดยที่พวกเขามีชื่อที่รัดกุม สิ่งนี้อาจช่วยคุณได้หากคุณต้องการให้แอพพลิเคชั่นต่าง ๆ ใช้แอสเซมบลีเวอร์ชันที่ต่างกัน อย่างไรก็ตามการใช้แอสเซมบลีเวอร์ชันต่าง ๆ ในแอปพลิเคชันเดียวยังคงทำให้คุณมีปัญหา
อะไรคือสาเหตุที่ทำให้คุณต้องใช้ทั้งสองรุ่นพร้อมกัน?
ได้อย่างแน่นอน คุณสามารถรับข้อผิดพลาดของคอมไพเลอร์ "อ้างอิงที่กำกวม" เมื่อวัตถุสองชิ้นไม่สามารถแยกความแตกต่างได้ โดยทั่วไปแล้วคุณสามารถระบุเส้นทางแบบเต็มในโค้ดและจะไม่ทำให้เกิดปัญหา แต่หาก DLLs เหมือนกันทั้งหมดคุณจะไม่สามารถแยกแยะความแตกต่างระหว่างวัตถุสองอย่างได้ Sya เรามีสอง DLLs:
System.IO ซึ่งมีระดับไฟล์
และ
MyProject.IO ซึ่งมีคลาสไฟล์
ถ้าคุณมีอะไรแบบนี้ ...
using System.IO;
using MyProject.IO;
...
private void foo()
{
File f = new File();
}
... คุณจะมีการอ้างอิงที่คลุมเครือเนื่องจากไม่มีวิธีที่จะบอกไฟล์ที่คุณกำลังพูดถึง นี้จะแก้ไขได้:
using System.IO;
using MyProject.IO;
...
private void foo()
{
MyProject.IO.File f = new MyProject.IO.File();
}
วิธีเดียวที่จะแก้ไขได้ยากคือถ้าเส้นทางของ "File" เหมือนกันในทั้งสองชุด แต่จะต้องมีสถานการณ์ที่ไม่น่าเป็นไปได้ที่ทั้งสอง Dll มีโครงสร้างเนมสเปซที่เหมือนกัน ตัวอย่างเช่นสถานการณ์ของฉันข้างต้นจะไม่เกิดขึ้นเนื่องจากไม่มีใครจะตั้งชื่อโครงการ "ระบบ" (ยกเว้นผู้พัฒนาที่แท้จริงของกรอบงาน. Net)