เป็นไปได้หรือไม่ที่ DLLs สองตัวเกิดข้อขัดแย้งป้องกันไม่ให้โซลูชันสร้าง


9

แม้ว่าฉันจะมีกรณีเฉพาะ แต่ฉันก็สงสัยเกี่ยวกับสถานการณ์ทั่วไป

สามารถเพิ่ม DLLs สองรายการเมื่ออ้างอิงกับโครงการ Visual C # ชนกันเพื่อป้องกันไม่ให้โซลูชันสร้างได้หรือไม่ หากเป็นกรณีนี้มีวิธีใดบ้างที่เป็นไปได้ที่จะบรรเทาปัญหานี้

คำตอบ:


13

เป็นไปได้มาก

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

หากคุณแน่ใจว่าคุณมีเนมสเปซที่ไม่เหมือนใครเช่นเดียวกับการอ้างอิงของคุณคุณจะไม่มีปัญหานี้

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

ทั้งปัญหาเหล่านี้สามารถแก้ไขได้โดยใช้ชื่อแทนการชุมนุมตามที่อธิบายไว้ที่นี่


ฉันไม่แน่ใจว่านี่เป็นเรื่องจริง หากคุณดูที่ CIL CLR จะอ้างถึงสัญลักษณ์อย่างชัดเจนภายในแอสเซมบลีบางอย่างพร้อมกับสัญลักษณ์ [แอสเซมบลี] ต่อหน้าแต่ละสัญลักษณ์ เป็นไปได้ว่าคอมไพเลอร์ C # บังคับใช้ปัญหานี้ แต่ฉันไม่คิดว่ามันเป็นข้อ จำกัด ของแพลตฟอร์ม
Yam Marcovic

@Yam Marcovic ผู้แต่งคิดอย่างไรว่า namespace ที่คุณพยายามจะใช้ในคลาสใด ความขัดแย้งของชื่อคลาสที่ผ่านการรับรองอย่างสมบูรณ์จะช่วยป้องกันการสร้าง
Jeremy

คอมไพเลอร์ C # ให้คุณมีตัวเลือกสำหรับชื่อแทนแอสเซมบลีเมื่อจัดการกับแอสเซมบลีที่มีชื่อเดียวกัน (และอาจมีสัญลักษณ์เดียวกันที่กำหนดไว้ในพวกเขา) ดูstackoverflow.com/questions/517058/…
Yam Marcovic

@Yam - จริง แต่คุณต้องรู้เกี่ยวกับธงนี้และใช้มัน เพียงแค่การเพิ่มการชุมนุมจะทำลายการสร้าง
Oded

1
อย่างชัดเจน นั่นเป็นเหตุผลที่เขามาที่นี่เพื่อขอความช่วยเหลือใช่มั้ย เขาต้องการที่จะรู้เกี่ยวกับธงนี้และใช้มันเพราะมันจะทำให้เขามีวิธีการแก้ปัญหาที่สะอาดขึ้นโดยไม่ส่งผลกระทบต่อโครงการหรือสาธารณูปโภคของบุคคลที่สาม
Yam Marcovic

4

เมื่อเห็นว่าไม่มีใครพูดถึงเรื่องนี้คุณถามว่า:

อะไรคือวิธีที่เป็นไปได้ในการลดสิ่งนี้

มีวิธีแก้ปัญหาที่สะอาดสำหรับกรณีนี้โดยไม่มีข้อ จำกัด และไม่มีวิธีแก้ไขปัญหาที่น่ารำคาญ คุณสามารถกำหนด Assembly alises เพื่อให้คอมไพเลอร์รู้ว่าจะอ้างอิงอะไรในตำแหน่งที่ถูกต้อง

ดูhttp://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx


3

ใช่มันเป็นไปได้มาก
สมมติว่าคุณเพิ่มการอ้างอิงถึง DLL บางตัวซึ่งใช้ Lucene.Net เวอร์ชันเก่าและคุณต้องการรวมเวอร์ชันล่าสุด
คุณสามารถแก้ปัญหานี้ได้โดยใช้นามแฝงภายนอก: http://msdn.microsoft.com/en-us/library/ms173212.aspx


+1 สิ่งนี้ดูเหมือนจะเป็นคำตอบที่ถูกต้องไม่ใช่นามแฝง "ภายนอก" เป็นอย่างไร
Jalayn

1

คุณสามารถใส่แอสเซมบลีเวอร์ชันต่าง ๆ ได้มากเท่าที่คุณต้องการในGlobal Assembly Cacheโดยที่พวกเขามีชื่อที่รัดกุม สิ่งนี้อาจช่วยคุณได้หากคุณต้องการให้แอพพลิเคชั่นต่าง ๆ ใช้แอสเซมบลีเวอร์ชันที่ต่างกัน อย่างไรก็ตามการใช้แอสเซมบลีเวอร์ชันต่าง ๆ ในแอปพลิเคชันเดียวยังคงทำให้คุณมีปัญหา

อะไรคือสาเหตุที่ทำให้คุณต้องใช้ทั้งสองรุ่นพร้อมกัน?


1
ฉันไม่ได้เพิ่มรุ่นที่แตกต่างกันอย่างชัดเจน โดยทั่วไปฉันมีแอพ WPF ตอนนี้เพื่อเพิ่มฟีเจอร์ของบุคคลที่สามฉันได้เพิ่มบาง DLLs และเป็น DLLs เหล่านี้ที่อาจขัดแย้งกัน
Shamim Hafiz

1
ตกลงคุณอาจเพิ่ม DLLs ที่เกี่ยวข้องกับบุคคลที่สามเหล่านี้ใน GAC ได้ไหม เป็นเวลานานมากแล้วที่ฉันได้อ่านเกี่ยวกับสิ่งเหล่านั้น แต่ฉันคิดว่ามันจะช่วยแก้ปัญหาของคุณได้
Jalayn

GAC มีความหมายที่นี่อย่างไร
Shamim Hafiz

1
แคชแอสเซมบลีสากลดูmsdn.microsoft.com/en-us/library/yf1d93sz%28v=vs.71%29.aspx
Jalayn

0

ได้อย่างแน่นอน คุณสามารถรับข้อผิดพลาดของคอมไพเลอร์ "อ้างอิงที่กำกวม" เมื่อวัตถุสองชิ้นไม่สามารถแยกความแตกต่างได้ โดยทั่วไปแล้วคุณสามารถระบุเส้นทางแบบเต็มในโค้ดและจะไม่ทำให้เกิดปัญหา แต่หาก 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)


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