การใช้ Type.GetType() กับแอสเซมบลีที่ไม่ได้อ้างอิงกับ Cassini/Visual Studio Dev เซิร์ฟเวอร์

ฉันมีรหัสบางอย่าง

var type = Type.GetType("namespace, assembly");
return Activator.CreateInstance(type);

ซึ่งทำงานได้ดีในสถานการณ์ส่วนใหญ่ แต่เมื่อโค้ดนี้ถูกอ้างอิงใน Global.asax ของเว็บไซต์ที่ถูกดีบั๊กโดยใช้ Cassini/Visual Studio Development Server ไม่พบประเภทดังกล่าว

ประเภทอยู่ในแอสเซมบลีที่ไม่ได้อ้างอิง แต่โดยปกติจะอยู่ในไดเร็กทอรีเอาต์พุตเดียวกันกับแอสเซมบลีที่ดำเนินการ อย่างไรก็ตาม เมื่อตรวจสอบอย่างใกล้ชิด ปรากฏว่าในระหว่างการดีบัก Cassini วางแอสเซมบลีที่ดำเนินการและแอสเซมบลีที่อ้างอิงแต่ละรายการลงในไดเร็กทอรีของตัวเองในตำแหน่งต่อไปนี้ C:\users...\AppData\Local\Temp\Temporary ASP.NET Files\root... .. อย่างไรก็ตามเห็นได้ชัดว่าไม่มีชุดประกอบ 'ที่ไม่ได้อ้างอิง' อยู่ที่นั่น

มีวิธีให้ VS คัดลอกทรัพยากรเพิ่มเติมลงในไดเร็กทอรีชั่วคราวหรือเรียกใช้จากไดเร็กทอรีที่ระบุหรือไม่? การใช้ IIS เป็นทางออกเดียวหรือไม่

ขอบคุณล่วงหน้า.


person Martin MacPherson    schedule 24.02.2010    source แหล่งที่มา


คำตอบ (2)


ฉันคิดว่านี่ไม่ใช่การกระทำของ Cassini นี่คือ ASP.NET ที่ใช้ .NET shadow copy เพื่อป้องกันการล็อค DLL ของคุณ ดังนั้นการใช้ IIS จึงไม่ควรเปลี่ยนแปลงอะไร การขาดการอ้างอิงที่ชัดเจนทำให้. NET ใส่ DLLs ลงในไดเร็กทอรีที่แตกต่างกัน

คุณสามารถใส่ DLL ที่อ้างอิงนี้ใน GAC ได้หรือไม่

person Timores    schedule 25.02.2010
comment
ใช่ว่าสมเหตุสมผล ลืมเรื่องนั้นไปเลย ฉันไม่อยากใช้ GAC จริงๆ เนื่องจากมีจำนวนแอสเซมบลีที่อ้างอิงแอสเซมบลีที่ไม่ได้อ้างอิงนี้ ฉันเดาว่าอีกทางเลือกหนึ่งคือการปิดการใช้งาน Shadow Copy (msdn.microsoft.com/en-us/library/)? ไม่มีใครมีวิธีแก้ไขปัญหาอื่นที่เป็นไปได้หรือไม่? - person Martin MacPherson; 25.02.2010

นี่เป็นการตอบสนองต่อความคิดเห็นของคุณในคำตอบแรก ("มีใครมีวิธีแก้ไขอื่นที่เป็นไปได้หรือไม่?")...

ใช่ มีวิธีแก้ไขที่ง่ายมาก และมันมาจากแหล่งเดียวกันกับที่ทำให้เกิด "ปัญหา" (สปอยล์...คือ System.AppDomain) มีเหตุการณ์ที่เรียกว่า "AssemblyResolve" ในคลาส AppDomain ที่คุณสามารถตอบกลับได้ (ใช้ AppDomain.CurrentDomain เพื่อรับอินสแตนซ์ AppDomain "ของคุณ") เหตุการณ์จะแจ้งชื่อ (สตริง) ของชุดประกอบที่ไม่พบให้คุณ ฉันถือว่าคุณรู้ตำแหน่งของแอสเซมบลีที่เป็นปัญหา ดังนั้นเพียงใช้ System.Reflection.Assembly.Load(pathToYourAssembly) เพื่อโหลดแอสเซมบลีแล้วส่งคืนอินสแตนซ์ Assembly ที่เมธอด "โหลด" ส่งคืน ตัวจัดการเหตุการณ์ "AssemblyResolve" แตกต่างออกไปเล็กน้อย มันมีประเภทการส่งคืน ดังนั้นในตัวจัดการเหตุการณ์ของคุณ คุณจะต้องดำเนินการ "return thisAssembly" โดยที่ "thisAssembly" คือค่าที่ส่งคืนของวิธีการ Load AppDomain ยังมีเหตุการณ์ TypeResolve (และอื่น ๆ ) ในกรณีที่ไม่พบประเภทในแอสเซมบลีที่ "ควรจะอยู่ใน" สิ่งนี้สามารถเกิดขึ้นได้หากคุณได้ย้ายประเภทจากแอสเซมบลีหนึ่งไปยังอีกแอสเซมบลีหนึ่งและไม่ได้คอมไพล์ใหม่ทุกอย่างที่อ้างอิงถึงประเภทนั้น อย่างไรก็ตามหวังว่าจะช่วยใครซักคนได้ ฉันรู้ว่านี่เป็นคำถามเก่า

person Paul Easter    schedule 06.05.2014