โปรแกรม WinForm .NET ที่ฉันเขียนเมื่อไม่นานมานี้ เนื่องจากมีการอ้างอิงไฟล์ไลบรารีจำนวนมาก แต่ไฟล์ไลบรารีเหล่านี้ได้รับการแก้ไขเมื่อเร็ว ๆ นี้สำหรับข้อบกพร่องและอัลกอริธึมบางอย่าง แต่ไฟล์โปรแกรมหลักไม่ได้มีการเปลี่ยนแปลงมากนัก จึงไม่เหมือนกับการคอมไพล์โปรแกรมหลักใหม่ ดังนั้นไฟล์ DLL เวอร์ชันใหม่ทั้งหมดจึงถูกคัดลอกไปยังไดเร็กทอรีที่รันอยู่ โดยหวังว่าโปรแกรมหลักจะสามารถเรียกไฟล์ไลบรารีเวอร์ชันใหม่ได้โดยตรง ปรากฎว่าไฟล์ไลบรารีเหล่านี้ได้รับการลงนามด้วยชื่อที่แข็งแกร่ง เกิดข้อผิดพลาดทันทีที่เรียกใช้โปรแกรมหลักโดยแจ้งว่าไม่พบไฟล์เวอร์ชันนี้
ต่อมา ฉันตรวจสอบ MSDN และพบว่าการเพิ่มโหนดรันไทม์ลงในการกำหนดค่าก็เพียงพอแล้ว
<รันไทม์>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<แอสเซมบลีที่ขึ้นต่อกัน>
<ชื่อ assemblyIdentity = "MyAssembly"
publicKeyToken="2b7c3a3291de04"
วัฒนธรรม = "เป็นกลาง" />
<bindingRedirect oldVersion = "3.0.0.8"
ใหม่เวอร์ชัน = "4.1.0.0"/>
</แอสเซมบลีที่ขึ้นต่อกัน>
</assemblyBinding>
</runtime>
อย่างไรก็ตาม ข้อกำหนดเบื้องต้นสำหรับสิ่งนี้คือ PublicKeyToken ของ DLL ทั้งสองเหมือนกัน ซึ่งหมายความว่าจะต้องเซ็นชื่อด้วยไฟล์ sn เดียวกัน
แน่นอนว่า หากไฟล์ไลบรารีของคุณไม่ได้ลงนามด้วยชื่อที่คาดเดายากเลย ก็ไม่จำเป็นต้องพิจารณาถึงปัญหาด้านเวอร์ชัน