การจัดการหน่วยความจำแอปพลิเคชัน .Net

อาจเป็นคำถามที่ไร้เดียงสามาก แต่สงสัยว่าสิ่งนี้ทำงานอย่างไร: สมมติว่าเรามี 10 โปรเจ็กต์ใน Visual Studio และ 5 โปรเจ็กต์มีการอ้างอิงถึง DLL ภายนอก (เช่น Ext.dll) โดยใช้พาธแบบสัมพัทธ์

ตอนนี้เมื่อแอปพลิเคชันของฉันถูกปรับใช้โดยทำงานบนเครื่องไคลเอนต์ Ext.dll จะถูกโหลด 5 ครั้งในหน่วยความจำหรือไม่ หรือมันจะถูกโหลดเพียงครั้งเดียวและถูกใช้โดยโปรเจ็กต์อ้างอิงอื่นๆ?


person Shankar Raju    schedule 11.02.2014    source แหล่งที่มา


คำตอบ (2)


แอสเซมบลีจะถูกโหลดเพียงครั้งเดียวในหน่วยความจำ

ตรวจสอบก่อนว่า CLR มีการโหลดแอสเซมบลีแล้วใน AppDomain ปัจจุบันหรือไม่ หากไม่ใช่แอสเซมบลีที่ถูกโหลดภายใต้ AppDomain มิฉะนั้นสัญลักษณ์จะได้รับการแก้ไขจากแอสเซมบลีที่โหลดแล้ว

แน่นอนเว้นแต่ว่าคุณกำลังสร้าง AppDomain อื่นด้วยตนเองซึ่งมีชุดแอสเซมบลีของตัวเอง

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


หากคุณต้องการตรวจสอบในช่วงเวลาหนึ่งว่าแอสเซมบลีใดถูกโหลดในหน่วยความจำ คุณสามารถใช้โค้ดส่วนนี้เพื่อรับแอสเซมบลีที่โหลดทั้งหมด:

var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
person Rohit Vats    schedule 11.02.2014
comment
ขอบคุณ Rohit แต่เราจะตรวจสอบ/ยืนยันว่าเป็นกรณีนี้ได้อย่างไร - person Shankar Raju; 11.02.2014

Clr โหลดแอสเซมบลีในหน่วยความจำเพียงครั้งเดียว

หมายเหตุ :สำหรับแต่ละอินสแตนซ์ของแอปพลิเคชัน Clr โหลดชุดประกอบอีกครั้ง

คุณสามารถอ่าน Clr ผ่าน c# ได้ในบทที่หนึ่ง คุณสามารถเรียนรู้แนวคิดเหล่านี้ได้มากมาย

person Community    schedule 11.02.2014