ไม่สามารถโหลดไฟล์หรือชุดประกอบ ... มีความพยายามในการโหลดโปรแกรมด้วยรูปแบบที่ไม่ถูกต้อง (System.BadImageFormatException)


408

ฉันมีสองโครงการProjectAและProjectB. เป็นโปรแกรมที่คอนโซลซึ่งขึ้นอยู่กับProjectB ProjectAเมื่อวานทุกอย่างทำงานได้ดี แต่ทันใดนั้นวันนี้เมื่อฉันทำงานProjectBฉันได้รับสิ่งนี้:

BadImageFormatException ไม่
สามารถจัดการได้ : ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'ProjectA, เวอร์ชัน = 1.0.0.0, Culture = neutral, PublicKeyToken = null' หรือการอ้างอิงอย่างใดอย่างหนึ่ง มีความพยายามในการโหลดโปรแกรมด้วยรูปแบบที่ไม่ถูกต้อง

ทั้งสองเป็นเพียงโครงการปกติโดยไม่มีการพึ่งพาโครงการอื่น ๆ ที่ไม่ใช่. Net ทั้งคู่เป็นแบบ. Net - ไม่มีรหัสเนทีฟและไม่มี P / Invoke ฉันมีโครงการอื่นที่ต้องพึ่งพาProjectAและยังทำงานได้ดี

สิ่งที่ฉันได้ลอง:

  • ตรวจสอบให้แน่ใจว่าทั้งสองโปรเจ็กต์ถูกตั้งค่าเป็น "CPU ใด ๆ " โดยที่เช็กบ็อกซ์บิลด์ถูกตรวจสอบ พวกเขาคือ.
  • ตรวจสอบให้แน่ใจว่าทั้งโครงการสำหรับเป้าหมายกรอบเดียวกัน(สุทธิโปรไฟล์ 4.0 Client)
  • ภายใต้ ProjectB -> การอ้างอิง -> ProjectA -> Properties ตรวจสอบให้แน่ใจว่า"Copy Local"ถูกตั้งค่าเป็น"True" _ (ฉันตรวจสอบว่า ProjectA.dll กำลังคัดลอกอย่างถูกต้อง)
  • ทำความสะอาด / สร้างโซลูชันใหม่ ฉันได้ลองลบโฟลเดอร์ / bin และ / obj ด้วยตนเองในทั้งสองโครงการ
  • เริ่ม Visual Studio ใหม่ รีสตาร์ทคอมพิวเตอร์ของฉัน
  • ลองดูที่เก็บใหม่ทั้งหมด

แต่ฉันยังคงได้รับข้อผิดพลาดเดียวกัน ฉันไม่รู้ว่าจะทำอย่างไรกับสิ่งนี้และไม่สามารถแก้ไขได้ ความคิดใด ๆ


1
หากคุณมีประวัติรุ่นในที่เก็บคุณสามารถตรวจสอบว่ามีความแตกต่างในไฟล์ csproj หรือไม่
Steve

@Steve: ตาม Mercurial ไม่มีการเปลี่ยนแปลงนอกจากการเพิ่มการอ้างอิงไปยังไฟล์. cs ใหม่
BlueRaja - Danny Pflughoeft

คุณได้รับพฤติกรรมเดียวกันในเครื่องอื่นหรือไม่? มีการเปลี่ยนแปลงอะไรอีกบ้างในเครื่อง (เช่นอัปเดต Windows อัปเดตอ้างอิง ฯลฯ )
Mike Parkhill

คุณลองคืนค่าไฟล์. cs ใหม่เหล่านั้นหรือไม่
Mike Parkhill

2
สิ่งนี้ใช้ได้กับฉัน ............ stackoverflow.com/a/9419522/191403
Som

คำตอบ:


647

ฉันค่อนข้างมั่นใจว่าคุณมีข้อขัดแย้งแบบ 32 บิต / 64 บิต ดูเหมือนว่าโครงการหลักของคุณอาจถูกตั้งค่าเป็น 32- บิตในขณะที่การอ้างอิงของชั้นเรียนถูกตั้งค่าเป็น 64- บิต ลองมองไปที่คำถาม SO นี้และนี้หนึ่งมากเกินไป ระหว่างสองคนนี้คุณควรจะสามารถเข้าใจปัญหาของคุณได้


71
Do'h ฉันหายไปอย่างสมบูรณ์แบบ "แพลตฟอร์มเป้าหมาย" แบบหล่นลงproject-->properties-->build- มันถูกกำหนดไว้สำหรับ x86; การตั้งค่าเป็น "CPU ใด ๆ " แก้ไขปัญหานี้ ฉันคิดเสมอว่าการตั้งค่านี้เหมือนกับดรอปดาวน์ "แพลตฟอร์มเป้าหมาย" ในเครื่องมือจัดการการกำหนดค่า แต่เห็นได้ชัดว่าไม่ใช่(ในความเป็นจริง "แพลตฟอร์มเป้าหมาย" ในเครื่องมือจัดการการกำหนดค่าดูเหมือนจะไม่ทำอะไรเลย!)
BlueRaja - Danny Pflughoeft

10
ตรวจสอบด้วยว่าโครงการนั้นไม่ใช่ซีพียูใด ๆ ที่มีการเลือกล่วงหน้า 32 บิต โครงการ -> คุณสมบัติ -> บิลด์
Reid Evans

26
PS: อีกเหตุผลคือ "เปิดใช้งานแอปพลิเคชัน 32 บิต" เป็น "เท็จ" ในการตั้งค่ากลุ่มแอป คุณต้องรีสตาร์ท IIS หลังจากตั้งค่าเป็นจริง
dvdmn

3
สิ่งที่แย่ที่สุดที่เกิดขึ้นกับฉันเมื่อเกิดข้อผิดพลาดนี้คือเมื่อ VS ตัดสินใจที่จะผนวก<PlatformTarget>x86</PlatformTarget>เข้ากับหนึ่งในโปรเจ็กต์ที่ต้องพึ่งพาโดยไม่มีเหตุผลเลย หากฉันไม่ได้ค้นหา SVN ฉันจะไม่เคยคิดเลยว่าทำไมแอป MVC ของเราจึงไม่สามารถเปิดใช้งานได้
jahu

1
โปรดตั้งค่าใน IIS DefaultAppPool-> เปิดใช้งานแอปพลิเคชั่น 32 บิต = True
Shantu

195

อาจเป็นเพราะคุณประสบปัญหากับเว็บไซต์ของคุณหลังจากปรับใช้บนเซิร์ฟเวอร์

แล้วคุณจะต้องปรับแอพลิเคชันของคุณเพื่อเปิดใช้งานโปรแกรม 32 บิต

ขั้นตอน

  1. เปิดตัวจัดการ IIS
  2. คลิกที่ Application Pools
  3. เลือกพูลแอ็พพลิเคชันที่คุณใช้
  4. จากบานหน้าต่างด้านขวาให้คลิกการตั้งค่าขั้นสูง ...

  5. ตั้งเปิดใช้งานแอปพลิเคชั่น 32 บิตเป็น True

    ตั้งค่าขั้นสูง เปิดใช้งาน 32 บิต


1
ฉันพลาดอะไรไปหรือเปล่า? OP กำลังพูดถึงแอพคอนโซลไม่ใช่การปรับใช้ IIS: "ProjectB เป็นแอปพลิเคชันคอนโซลซึ่งขึ้นอยู่กับ ProjectA"
MickyD

129

ฉันเพิ่งมีข้อความแสดงข้อผิดพลาดนี้ที่เรียกใช้ IIS Express ใน Visual Studio 2015 ในกรณีของฉันฉันต้องใช้ IIS Express เวอร์ชัน 64 บิต:

เครื่องมือ→ตัวเลือก→โครงการและโซลูชัน→โครงการเว็บ
เลือกกล่องที่ระบุว่า "ใช้ IIS Express เวอร์ชั่น 64 บิตสำหรับเว็บไซต์และโครงการ"

ภาพหน้าจอ:

สกรีนช็อตของตัวเลือก VS สำหรับโครงการเว็บ


2
ตรงกันข้ามใช้กับฉันได้
ติ๊ก

32

ฉันมีปัญหาเดียวกันนี้ ฉันตั้ง "เป้าหมายแพลตฟอร์ม" ของโครงการ A ("โครงการ A" (คลิกขวา) -> คุณสมบัติ -> สร้าง -> "เป้าหมายแพลตฟอร์ม") เป็น x86 แต่ทำให้ Project B's อยู่ที่ "Any CPU" การตั้งค่าโครงการ B เป็น "x86" แก้ไขสิ่งนี้


15

ฉันมีปัญหานี้ในการใช้งานการทดสอบหน่วย (xunit) ใน Visual Studio 2015 และพบกับการแก้ไขต่อไปนี้:

Menu Bar -> Test -> Test Settings -> Default Processor Architecture -> X64

7

คุณอาจต้องเปลี่ยนการตั้งค่ากลุ่มแอปพลิเคชัน "เปิดใช้งานแอปพลิเคชัน 32 บิต" เป็น TRUE ใน IIS7 ถ้าคุณมี dll 32.exeอย่างน้อย 1 32 บิตในโครงการของคุณ


OP กำลังพูดถึงแอพคอนโซลไม่ใช่ IIS
MickyD

5

ก่อนอื่นฉันได้สิ่งนี้ใน VS2017 ด้วยโปรเจ็กต์เก่าฉันต้องทำการเปลี่ยนแปลงเล็กน้อยและอัปเดตโปรเจ็กต์ทั้งหมดเป็นเฟรมเวิร์ก 4.7


มีอีกหลายคนที่กล่าวถึงการเลือกAny CPUสามารถแก้ไขปัญหานี้ได้

มีสถานที่สองแห่งที่คุณต้องทำและอาจไม่ง่ายเหมือนการเลือกจากเมนูแบบเลื่อนลง นี้แก้ไขให้ฉัน:

1) คุณต้องทำทั้งสองอย่างที่นี่:

ป้อนคำอธิบายรูปภาพที่นี่

2) และในConfiguration Manager(คลิกขวาบนโซลูชัน)

ป้อนคำอธิบายรูปภาพที่นี่

แต่ถ้ามันไม่ได้มี ???

จากนั้นคลิกNewและเลือกการตั้งค่าเหล่านี้: ( ขอบคุณ @RckLN )

ป้อนคำอธิบายรูปภาพที่นี่


2

ฉันมีปัญหาเดียวกันกับหลายโครงการในโซลูชันเดียวกันฉันสิ้นสุดการตั้งค่ากรอบงานเป้าหมายทั้งหมดเป็น. NET Framework 4 และ x86 สำหรับ CPU เป้าหมายและในที่สุดก็รวบรวมได้สำเร็จ


1
ทำงานใน Release แต่ล้มเหลวใน Debug ตั้งค่าทั้งหมดเป็น. Net Framework 4 (ไม่อัปเดต 1) และดีบักรันทันที
DCastenholz

2

คุณอาจเห็นปัญหานี้หากคุณพยายามทำแพคเกจโครงการ 64 บิตด้วยตัวติดตั้ง MSI ใน VS ("เหตุผลก็เพราะ shim เนทีฟที่ทำแพ็กเกจด้วยไฟล์. msi นั้นสามารถเรียกใช้งานได้แบบ 32 บิต")

ดูที่นี่สำหรับรายละเอียดเพิ่มเติม: http://blogs.msdn.com/b/heaths/archive/2006/02/01/64-bit-managed-custom-actions-with-visual-studio.aspx


1
พิจารณาสรุปบทความที่เชื่อมโยงเพื่อประโยชน์ของผู้อ่านในอนาคต ในกรณีที่ลิงค์เสียชีวิต
บอนด์ - Java Bond

2

วิธีการแก้ปัญหาเหล่านี้ไม่เหมาะกับฉัน - แต่ด้วยการลบเนื้อหาของ bin และ obj โฟลเดอร์ทุกอย่างก็เจ๋งอีกครั้ง


2

ฉันได้รับสิ่งนี้เมื่อสร้างโครงการผ่าน Visual Studio Online (VSTS) Build โดยใช้ Visual Studio Buildขั้นตอน

ทางออกคือ:

  • ลบโฟลเดอร์ซอร์สที่มีอยู่
  • ตั้งค่า 'ใด ๆ CPU' อย่างชัดเจนในแพลตฟอร์มสำหรับ Visual Studio Builds ทั้งหมดรวมถึงการพึ่งพา (ดูภาพหน้าจอด้านล่าง)
  • เรียกใช้งานบิลด์ใหม่

ภาพหน้าจอ VSO



1

ฉันพบปัญหาเดียวกัน มันโผล่ขึ้นมาจากสีน้ำเงินและมันดูแปลกสำหรับฉัน

ในภาพรวมข้อยกเว้นสำหรับ FusionLog ฉันเห็นข้อความต่อไปนี้ภายในข้อความ:

... C: \ Windows \ Microsoft.NET \ Framework64 ...

เพิ่มเติมเกี่ยวกับบันทึกการฟิวชั่น: http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx

โครงการทั้งหมดมี CPU เป้าหมายของ AnyCPU ฉันเปลี่ยนโครงการแอปพลิเคชัน (โครงการที่อ้างอิงโครงการอื่นทั้งหมด) เป็น CPU เป้าหมายของ x86 มันได้ผลแล้ว

ไม่แน่ใจว่าซีพียูเป้าหมายรวมเกิดขึ้นโดยไม่มีเหตุผลที่ชัดเจน แต่ทำ


1

ฉันยังประสบปัญหานี้ในโครงการหลังจากไม่กี่นาทีที่ฉันพบวิธีแก้ปัญหาปัญหานี้เกิดจากการกำหนดค่า CPU หากคุณใช้Visual Studio 2010 หรือ VS 2013เพียงแค่คุณสมบัติของโครงการ goto แล้วเลือกคอมไพล์จากแถบด้านข้าง และจะมี 5 แบบหล่นลงส่วนที่ 5 แบบหล่นลงจะเป็นTarget CPU:คุณควรตั้งเป็นx86 หรือ x64ตามความต้องการของคุณแทน CPU ใด ๆ

ปัญหาของฉันได้รับการแก้ไขหลังจากเปลี่ยนเป็น x86


1

สิ่งนี้สามารถเกิดขึ้นได้โดยการกำหนดเฟรมเวิร์กที่รองรับหลายตัวในไฟล์app.configและบังคับให้แอปทำงานในกรอบงาน. NET อื่น ๆ นอกเหนือจากที่กล่าวถึงก่อนในไฟล์ app.configกล่าวถึงเป็นครั้งแรกในไฟล์

และสิ่งนี้ก็จะเกิดขึ้นเช่นกันเมื่อคุณมีกรอบงานทั้งสองที่กล่าวถึงในระบบของคุณ

เป็นวิธีแก้ปัญหานำเฟรมเวิร์กเป้าหมายที่คุณจะใช้สำหรับการดีบักใน app.config

เช่นถ้าคุณพยายามเรียกใช้ใน. NET 4 ไฟล์กำหนดค่าควรมีสิ่งที่คล้ายกับสิ่งนี้

<supportedRuntime version="v4.0"/>
<supportedRuntime version="v2.0.50727"/>

1

ในโครงการของฉันสำหรับ C # คุณสมบัติโครงการ -> [Build] -> เป้าหมายแพลตฟอร์ม: CPU ใด ๆ และยกเลิกการเลือก Prefer 32 บิตเพื่อให้คอมไพเลอร์เลือกโดยอัตโนมัติ


1

แอสเซมบลี Chilkat .NET 4.5 จำเป็นต้องติดตั้งรันไทม์ VC ++ 2012 หรือ 2013 บนคอมพิวเตอร์เครื่องใดก็ได้ที่แอปพลิเคชันของคุณทำงาน คอมพิวเตอร์ส่วนใหญ่จะติดตั้งไว้แล้ว คอมพิวเตอร์สำหรับการพัฒนาของคุณจะได้รับเนื่องจากติดตั้ง Visual Studio อย่างไรก็ตามหากการปรับใช้กับคอมพิวเตอร์ที่ไม่สามารถใช้งาน runtime VC ++ ที่ต้องการข้อผิดพลาดดังกล่าวจะเกิดขึ้น:

ติดตั้งแพ็คเกจการร้องทั้งหมด

Visual C ++ แพ็คเกจที่แจกจ่ายต่อได้สำหรับ Visual Studio 2013 - vcredist_x64

Visual C ++ แพ็คเกจที่แจกจ่ายต่อได้สำหรับ Visual Studio 2013 - vcredist_x86

แพคเกจสามารถเผยแพร่ต่อ c ++ เสมือนสำหรับ Visual Studio 2012 - vcredist_x64

Visual C ++ แพ็คเกจที่แจกจ่ายต่อได้สำหรับ Visual Studio 2012 - vcredist_x86


1

หากคุณใช้ LibreOffice จากโปรแกรมของคุณผ่านการรวม cli .netอย่างฉันฉันได้รับข้อผิดพลาดเดียวกัน ฉันใช้ LibreOffice เวอร์ชันเก่ากับสภาพแวดล้อมการผลิตบนพีซีของฉันฉันติดตั้งเวอร์ชันที่ใหม่กว่าซึ่งขัดแย้งกัน เพียงถอนการติดตั้ง LibreOffice ฉันพบวิธีแก้ปัญหาที่นี่ . NET CLI: ไม่สามารถโหลดไฟล์หรือชุดประกอบ 'cli_cppuhelper'


0

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


0

ฉันยังมีปัญหานี้ในการทดสอบหน่วยโดยใช้ ReSharper ใน Visual Studio 2017 และแก้ไขด้วยการกำหนดค่าต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

นอกจากนี้คุณสามารถเปลี่ยนการตั้งค่าการทดสอบการเรียกใช้ของ ReSharper: https://resharper-support.jetbrains.com/hc/en-us/articles/207242715-How-to-run-MSTest-tests-using-x64-configuration


0

ในกรณีของฉันการพึ่งพาหายไปใน dll ที่โยนข้อยกเว้นนี้ ฉันตรวจสอบกับ Dependency Walker เพิ่ม dll ที่หายไปและแก้ไขปัญหาแล้ว

โดยเฉพาะอย่างยิ่งฉันได้รับความเสียหาย opencv_core340.dll ของฉันโดยการเพิ่มคำหลัก SVN ไปโดยไม่ตั้งใจและทำให้ dll ของฉันไม่สามารถใช้งานได้อีกต่อไป อย่างไรก็ตามฉันไม่เชื่อว่าวิธีแก้ปัญหานี้ขึ้นอยู่กับว่า dll เสียหายหรือหายไป ฉันแค่เพิ่มสิ่งนี้เพื่อให้ข้อมูลที่ครบถ้วน


0

ยิง! ฉันรู้เกี่ยวกับปัญหานี้ ฉันคิดว่าฉันทำทุกอย่างถูกต้องจนกว่าฉันจะเห็น 'x86' โดยไม่ตั้งใจในหน้าต่างเอาต์พุต VS และนั่นคือตอนที่ฉันได้รับสาเหตุ เสียเวลาไปสองสามนาทีในวันนี้

การกำหนดค่าภายใต้หน้าต่าง 'เผยแพร่' ถูกตั้งค่าเป็น 'x86'; ในขณะที่ทุกที่อื่นมันคือ 'x64'

โปรดตรวจสอบให้แน่ใจว่าเป็นข้อมูลที่ตรงกันในเครื่องมือจัดการการกำหนดค่าการเผยแพร่การตั้งค่าการกำหนดค่าโซลูชันและการตั้งค่า IIS (หากเป็นเว็บเซิร์ฟเวอร์ของคุณ)

นอกจากนี้โปรดทราบ - VS เป็นแอพ 32 บิตและ IIS คือ 64 บิต แอป 32 บิตถูกปิดใช้งานโดยค่าเริ่มต้นใน IIS

ป้อนคำอธิบายรูปภาพที่นี่


0

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


0

ฉันมีปัญหาเดียวกัน โครงการ B ในกรณีของฉันคือ. Net Core Class Library ซึ่งมี Nuget "Microsoft.Management.Infrastructure" ติดตั้งอยู่ ข้อผิดพลาดคือฉันเรียกโครงการ B "MI" ของฉัน ฉันเปลี่ยนชื่อโครงการเป็นอย่างอื่นและทุกอย่างก็ทำงานได้อีกครั้ง


-1

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


-1

คุณพยายามเรียกใช้ไฟล์. exe จาก cmd หรือไม่ นี่คือความผิดพลาดของฉัน เพียงแค่เรียกใช้ไฟล์. exe โดยดับเบิลคลิก ถ้าเป็น. NET Core SCD สำหรับ Windows 8.1 / Windows Server 2012 R2 x64

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