จะดึงคุณสมบัติ LoaderException ได้อย่างไร?


128

ฉันได้รับข้อความแสดงข้อผิดพลาดขณะอัปเดตข้อมูลอ้างอิงบริการของฉัน:

คำเตือนเครื่องมือที่กำหนดเอง: ไม่สามารถโหลดประเภทที่ร้องขออย่างน้อยหนึ่งประเภท ดึงคุณสมบัติ LoaderExceptions สำหรับข้อมูลเพิ่มเติม

ฉันจะดึงคุณสมบัติ LoaderException ได้อย่างไร?

อัปเดต:ข้อผิดพลาดของฉันหายไปเมื่อฉันนำเข้าโครงการออบเจ็กต์โดเมนอีกครั้ง ฉันไม่รู้ว่าทำไมสิ่งนี้จึงแก้ไขปัญหาได้ แต่ฉันดีใจที่ได้ผล


6
คุณจัดการแก้ไขปัญหานี้อย่างไร "การนำเข้าโครงการออบเจ็กต์โดเมนซ้ำ" หมายความว่าอย่างไร (ลบการอ้างอิงโครงการและเพิ่มอีกครั้งหรือไม่)
Nikos Tsokos

คำตอบ:


143
try
{
  // load the assembly or type
}
catch (Exception ex)
{
  if (ex is System.Reflection.ReflectionTypeLoadException)
  {
    var typeLoadException = ex as ReflectionTypeLoadException;
    var loaderExceptions  = typeLoadException.LoaderExceptions;
  }
}

1
ฉันทำเครื่องหมายว่าคุณเป็นคำตอบเพราะคิดว่าจะเป็นประโยชน์มากที่สุดสำหรับผู้อื่นที่พบคำเตือน / ข้อผิดพลาดนี้
rozon

3
ฉันกำลังพยายามใช้โซลูชันนี้ แต่ฉันไม่มีจุดเริ่มต้นในบริการ WCF ของฉันที่จะปิดกั้นการทดลอง
จอร์แดน

3
คำตอบนี้จะได้ผลสำหรับฉันหากมีส่วนเกี่ยวข้องกับรหัสของฉัน ฉันวางtry...catchรอบทั้งInstaller.csชั้นแล้วไม่มีอะไรเลย! รหัสของฉันไม่โยนสิ่งนี้เมื่อมันทำงานเฉพาะเมื่อฉันพยายามเรียกใช้โปรแกรมติดตั้ง ไม่มีใครรู้วิธีการดึงคุณสมบัติ LoaderExceptions สำหรับข้อมูลเพิ่มเติม? ชอบเรียกดูโฟลเดอร์และดูไฟล์บันทึกหรือไม่?
jp2code

5
ประโยค catch จะจับข้อยกเว้นทั้งหมด แต่จัดการเฉพาะ ReflectionTypeLoadExceptions อะไรแบบนี้น่าจะดีกว่า catch (ReflectionTypeLoadException ex) { var typeLoadException = ex as ReflectionTypeLoadException; var loaderExceptions = typeLoadException.LoaderExceptions; }
Scott Munro

1
@ScottMunro: ถ้าคุณจับได้ว่าเป็นประเภทเดียวทำไมต้องสร้างตัวแปรอื่นที่มีประเภทเดียวกันและทำการแคสต์? สิ่งนี้ควรจะเพียงพอ: catch (ReflectionTypeLoadException ex) { var loaderExceptions = ex.LoaderExceptions; }. นอกจากนี้เว้นแต่คุณคาดว่านักแสดงจะล้มเหลวและจะตรวจสอบค่าว่างการร่ายโดยตรงจะดีกว่าดังนั้นการร่ายจะล้มเหลวทันทีและไม่เกิดขึ้นในภายหลังโดยมีข้อยกเว้นการอ้างอิงที่เป็นโมฆะ:var typeLoadException = (ReflectionTypeLoadException)ex;
Nelson Rothermel

74
catch (ReflectionTypeLoadException ex)
{        
    foreach (var item in ex.LoaderExceptions)
    {
          MessageBox.Show(item.Message);                    
    }
}

ฉันขอโทษที่ทำให้เธรดเก่าฟื้นคืนมาอีกครั้ง แต่ต้องการโพสต์วิธีแก้ปัญหาอื่นเพื่อดึงข้อยกเว้นของตัวโหลด (โดยใช้ ReflectionTypeLoadException จริง) เพื่อให้ใครก็ตามที่เจอสิ่งนี้


2
เพียงแค่ FYI หากคุณใช้บริการ Win (เหมือนฉัน) MessageBox จะไม่ปรากฏเนื่องจากองค์ประกอบ UI จะถูกบล็อกโดยอัตโนมัติ ส่วนที่เหลือของการใช้งานมีประโยชน์ บันทึกลงในไฟล์บันทึกแทน ขอบคุณ
Vippy

1
"คำสั่ง catch ไม่มีบล็อกคำสั่ง" พระเจ้าฉันเกลียดพาวเวอร์เชลล์
นกฮูก

ขอบคุณมากโซลูชันนี้มีความแม่นยำเนื่องจากระบุปัญหาที่แน่นอน ไม่มีจุดหมายในการจับข้อยกเว้นและไม่ทำอะไรเลย
Muhammad Ashhar Hasan

5

การใช้ Quick Watch ใน Visual Studio คุณสามารถเข้าถึง LoaderExceptions จาก ViewDetails ของข้อยกเว้นที่ถูกโยนเช่นนี้:

($exception).LoaderExceptions

ขอบคุณ! ทำให้ฉันสงสัยว่าทำไมไม่รวมข้อมูลนั้นโดยไม่จำเป็นต้องเข้าถึงLoaderExceptionsเพราะมันมีข้อมูลที่เกี่ยวข้องจริงๆ
GuiRitter

0

อีกทางเลือกหนึ่งสำหรับผู้ที่กำลังสำรวจและ / หรือในโหมดโต้ตอบ:

$ ข้อผิดพลาด [0] .Exception.LoaderExceptions

หมายเหตุ: [0] คว้าข้อผิดพลาดล่าสุดจากสแต็ก

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