“ มีความพยายามในการโหลดโปรแกรมด้วยรูปแบบที่ไม่ถูกต้อง” แม้ว่าแพลตฟอร์มจะเหมือนกันก็ตาม


461

ฉันกำลังเรียกใช้ฟังก์ชันจาก DLL ที่ไม่มีการจัดการ 32 บิตในระบบ 64 บิต สิ่งที่ฉันได้รับคือ:

BadImageFormatException: มีความพยายามในการโหลดโปรแกรมด้วยรูปแบบที่ไม่ถูกต้อง (ข้อยกเว้นจาก HRESULT: 0x8007000B)

ตอนแรกฉันตั้งโปรเจคของฉันเป็นแพลตฟอร์มใด ๆ ของ CPU ดังนั้นฉันจึงเปลี่ยนทั้งสองเป็น x86 แต่ข้อผิดพลาดนี้ยังคงเกิดขึ้น นั่นเป็นสิ่งเดียวที่ฉันรู้ในเรื่องนี้

DLLs ไม่เสียหายหรืออะไรเพราะฉันสามารถใช้พวกเขากับโปรแกรมอื่น ๆ (ที่ฉันไม่มีที่มา) ฉันคิดว่าบางทีมันอาจจะไม่ได้รับการอ้างอิง แต่ฉันตรวจสอบและพวกเขาทั้งหมดอยู่ที่นั่น นอกจากนี้จะไม่โยนDllNotFoundExceptionในกรณีนี้หรือไม่?

ฉันจะทำอะไรได้อีก และก่อนที่คุณจะพูดว่า "ใช้ DLL ที่ไม่มีการจัดการ 64 บิตแทน" ให้ฉันชี้ให้เห็นว่าไม่มี ;)


1
โครงการอะไรที่คุณเปลี่ยนเป็น x86 และคุณจะดำเนินการอย่างไรเมื่อคุณได้รับข้อยกเว้นผ่านดีบักเกอร์หรือด้วยตนเอง หากหลังคุณสังเกตเห็นว่าเมื่อคุณเปลี่ยนเป็น x86 คุณได้รับโฟลเดอร์ใหม่ใน bin \ directory ของคุณหรือไม่ ตอนนี้มันเป็น bin \ x86 \ Debug สำหรับไฟล์
— Lasse V. Karlsen

คุณสามารถตรวจสอบได้ว่าไฟล์ปฏิบัติการกำลังทำงานในโหมด 32 บิต (* 32 ในโปรแกรมจัดการกระบวนการ) หรือไม่?
— JP Alioto

@ Lasse V. Karlsen: ใช่ฉันลบ x86 บิตออกจากเส้นทางออกเมื่อฉันเปลี่ยนแพลตฟอร์มในแต่ละโครงการ โครงการแรกของฉันคือ DLL ที่ล้อมรอบฟังก์ชันใน DLL ที่ไม่มีการจัดการ โครงการที่สองคือการปฏิบัติการที่ใช้ wrapper ใน DLL แรก ทั้งคู่ถูกตั้งค่าเป็น x86
— David Brown

@JP: อันที่จริงผู้จัดการกระบวนการไม่แสดงว่ากำลังทำงานเป็นกระบวนการแบบ 32 บิต ทำไมถึงเป็นอย่างนั้น?
— David Brown

คำตอบ:


532

หากคุณพยายามเรียกใช้แอปพลิเคชั่นแบบ 32 บิตบน IIS 7 (และ / หรือเครื่อง OS 64 บิต) คุณจะได้รับข้อผิดพลาดเดียวกัน ดังนั้นจาก IIS 7 ให้คลิกขวาที่กลุ่มแอปพลิเคชันและไปที่ "การตั้งค่าขั้นสูง" และเปลี่ยน "เปิดใช้งานแอปพลิเคชัน 32 บิต" เป็น "TRUE"

รีสตาร์ทเว็บไซต์ของคุณและควรใช้งานได้

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


1
โอ้วันที่ฉันเคยตกปลาไปกับการติดตั้งส่วนประกอบ IIS พิเศษเมื่อนี่คือคำตอบ ... ทุกคนสามารถแนะนำข้อเสียของการเลือกตัวเลือกนี้ได้หรือไม่?
— notidaho

3
นี่คือการอภิปรายที่ดีเกี่ยวกับคำถามของประสิทธิภาพการทำงานเกี่ยวกับเรื่องนี้: stackoverflow.com/questions/507820/…
— Ben Power

ฉันมีปัญหากับ SharpSvn และสิ่งนี้ไม่ได้ช่วย :( Sth ผิดกับชุดนี้ฉันบอกคุณ ...
— user2173353

4
คำตอบนี้เป็น wtf สำหรับฉันเพราะคำถามไม่ได้พูดถึง IIS เลย!
— kristianp

129

ยังไงก็ตามกล่องกาเครื่องหมายBuildในเครื่องมือจัดการการกำหนดค่าไม่ได้ถูกตรวจสอบสำหรับปฏิบัติการของฉันดังนั้นมันจึงยังคงทำงานกับ Build CPU ใด ๆ ที่เก่า หลังจากที่ฉันแก้ไขแล้ว Visual Studio บ่นว่ามันไม่สามารถตรวจแก้จุดบกพร่องของแอสเซมบลีได้ แต่นั่นก็แก้ไขด้วยการรีสตาร์ท


ขอบคุณมาก. สิ่งนี้ทำให้ฉันเหมือนกัน การตรวจสอบบิลด์ในเครื่องมือจัดการการกำหนดค่าและตอนนี้ก็ใช้งานได้ (แอปพลิเคชัน WPF เดสก์ท็อป)
— danglund

1
หากคุณทำตามข้างต้นทั้งหมดและตรวจสอบการตั้งค่าแพลตฟอร์มของคุณสร้างการตั้งค่าการกำหนดค่าทำความสะอาดโซลูชันและยังใช้งานไม่ได้ - ค้นหา DLL ทั้งหมดและลบออก
— จะ Calderwood

กับ VS 2015 นี้ยังคงถูกต้อง - แม้ว่าฉันไม่จำเป็นต้องรีสตาร์ท :)
— increddibelly

แค่นั้นแหละ! ไปที่การตั้งค่าเครื่องมือจัดการการกำหนดค่าอีกครั้งคือคำตอบ
— AndyUK

74

ในVisual Studioคลิกขวาที่โครงการของคุณ-> ที่บานหน้าต่างด้านซ้ายคลิกแท็บสร้าง

คุณสมบัติโครงการสร้างแท็บ

ภายใต้แพลตฟอร์มเป้าหมายให้เลือก x86 (หรือโดยทั่วไปแล้วสถาปัตยกรรมที่จะจับคู่กับไลบรารีที่คุณกำลังลิงก์ไป)

คุณสมบัติโครงการเป้าหมายแพลตฟอร์ม

ฉันหวังว่านี่จะช่วยให้ใครบางคน! :)


2
สิ่งนี้แก้ไขปัญหาของฉันใน VS2013 ฉันพบการแก้ไขทางเลือกคือการปล่อย "แพลตฟอร์มเป้าหมาย" เป็น "CPU ใด ๆ " แต่ทำเครื่องหมายที่ช่อง "ชอบ 32- บิต"
— user1069816

2
แม้ว่าคุณจะต้องใช้. NET 4.5 หรือสูงกว่าเพื่อให้สามารถทำเครื่องหมายในช่อง "ชอบ 32- บิต"
— user1069816

1
ใช่ แต่ฉันแปลงโครงการของฉันใน 'Any CPU' เป็น 'x64' โปรเจ็กต์ 32 บิตของฉันทำงานได้ดี แต่รหัสเดียวกันฉันแปลงเป็น 64 บิตโปรเจ็กต์นั้นไม่ทำงานเป็น 32 บิต คุณช่วยมอบกระบวนการแปลง 64 บิตที่เหมาะสมให้ฉันได้ไหม ...
— Ismayil S

@IsmayilS ตรวจสอบให้แน่ใจว่าคุณใช้ไลบรารี่เวอร์ชัน 64 บิตที่คุณเชื่อมโยงไปถึง
— Marvin Thobejane

53

ฉันเพิ่งมีปัญหานี้ด้วย ลองใช้คำแนะนำทั้งหมดที่นี่ แต่พวกเขาไม่ได้ช่วย

ฉันพบสิ่งอื่นเพื่อตรวจสอบว่าได้แก้ไขให้ฉันแล้ว ใน Visual Studio คลิกขวาที่โครงการและเปิด "Properties" คลิกที่แท็บ "รวบรวม" (หรือ "สร้าง") จากนั้นคลิกที่ "ตัวเลือกการรวบรวมขั้นสูง" ที่ด้านล่าง

ตรวจสอบรายการแบบหล่นลง "Target CPU" ควรตรงกับ "แพลตฟอร์ม" ที่คุณกำลังสร้าง นั่นคือถ้าคุณกำลังสร้าง "CPU ใด ๆ " ดังนั้น "Target CPU" ควรพูดว่า "Any CPU" ทำตามแพลตฟอร์มทั้งหมดของคุณด้วยการทำให้มันใช้งานได้และตรวจสอบการตั้งค่านี้


2
และสำหรับพวกเราเพียงแค่ใช้คอมไพเลอร์แก้ไขของฉันคือการเพิ่ม "/ แพลตฟอร์ม: x86" เพื่อธงคอมไพเลอร์
— Urchin

สิ่งนี้แก้ไขให้ฉันเช่นกัน ฉันต้องปรับ "เป้าหมายแพลตฟอร์ม" บนแท็บ "สร้าง"
— Jowen

หากคุณใช้เวลา 64 บิตให้ตรวจสอบการตั้งค่าสถานะ "ชอบ 32 บิต" ฉันต้องปิดการใช้งานสำหรับฉัน
— N4ppeL

51

หากคุณพบข้อผิดพลาดนี้เมื่อคุณคลิกปุ่มลูกศรสีเขียวเพื่อเรียกใช้แอปพลิเคชัน แต่ยังคงต้องการเรียกใช้แอปใน 64 บิต คุณสามารถทำได้ใน VS 2013, 2015, 2017 และ 2019

ไปที่: เครื่องมือ> ตัวเลือก> โครงการและโซลูชัน> โครงการบนเว็บ> ใช้ IIS Express เวอร์ชัน 64 บิต


3
ขอบคุณ ฉันพยายามมากมายและไม่มีอะไรช่วย คุณคือผู้ช่วยชีวิตของฉัน ฉันมีระบบปฏิบัติการ 64 บิตติดตั้ง Visual Studio 64 บิต [ซึ่งยังคงทำงานเป็น 32 บิตโดยไม่ทราบสาเหตุ] เมื่อฉันวางแพลตฟอร์มเป้าหมายของฉันไปที่ x64 นั่นเป็นข้อผิดพลาดในการขว้างปา BadImageFormatException ด้วยการแก้ไขของคุณมันทำงานได้ ฉันให้คุณ upvote You rock
— SKCS Kamal

ฉันดีใจที่ฉันสามารถช่วยได้ :)
— paibamboo

นี่คือคำตอบที่ฉันต้องการ ขอบคุณมาก!
— yushulx

ขอบคุณมากสิ่งนี้แก้ปัญหาได้แล้ว มันทำงานได้ดีกับกระบวนการ 32 บิตของ Visual Studio 2017
— samir105

1
ยังคงใช้ได้กับ VS 2019 ขอบคุณ
— Jake Gaston

36

หากคุณใช้CPU ใด ๆคุณอาจพบปัญหานี้หากเลือกตัวเลือกPrefer 32- บิต :

ตรวจสอบให้แน่ใจว่าคุณยกเลิกการเลือกตัวเลือกนี้ในแท็บBuildของโครงการ!

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


3
มันจะมีประโยชน์ถ้าคุณสามารถระบุตำแหน่งใน Visual Studio เพื่อค้นหาตัวเลือกนี้
— trysis

@trysis ตัวเลือกนี้อยู่ในหน้าBuildของบานหน้าต่างการตั้งค่าโครงการ
— Drew Noakes

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

เส้นทางสำหรับรับแบบฟอร์มนี้คืออะไร ฉันหามันไม่เจอ
— Adolfo Correa

ใน Visual Studio ให้คลิกขวาที่โครงการและเลือก 'คุณสมบัติ'
— Drew Noakes

8

หัวข้อสั้น ๆ สำหรับโพสต์นี้ แต่การค้นหาข้อความแสดงข้อผิดพลาดทำให้ฉันมาที่นี่

หากคุณกำลังสร้างผ่านระบบทีมและรับข้อผิดพลาดนี้แท็บกระบวนการสร้างคำจำกัดความจะมีการตั้งค่า "แพลตฟอร์ม MSBuild" หากตั้งค่าเป็น "อัตโนมัติ" คุณอาจประสบปัญหานี้ การเปลี่ยนเป็น "X86" สามารถแก้ไขข้อผิดพลาดได้เช่นกัน


นี่คือคำตอบที่ใกล้เคียงที่สุดกับสิ่งที่ฉันกำลังประสบอยู่ ฉันมี dll ที่ต้องเป็น x86 ฉันใช้มันในโครงการอื่นซึ่งเป็น AnyCPU ตามค่าเริ่มต้น พวกเขาแค่ต้องจับคู่ ในกรณีนี้มันไม่ได้สร้างความแตกต่างอย่างมากดังนั้นฉันจึงเปลี่ยนโครงการใหม่เป็น x86
— เกอร์

8

ในกรณีของฉันฉันใช้ DLL ดั้งเดิมใน C # DLL นี้ขึ้นอยู่กับ DLLs อื่น ๆ ที่หายไปสองสามรายการ เมื่อ DLLs อื่นเหล่านั้นถูกเพิ่มทุกอย่างทำงาน


4

การสร้างคำตอบของ @paibamboo

เขากล่าวว่า: ไปที่: เครื่องมือ> ตัวเลือก> โครงการและโซลูชัน> โครงการบนเว็บ> ใช้ IIS Express เวอร์ชัน 64 บิต

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

ดูเหมือนว่ามีสองสถานที่ที่สถานะของกล่องนี้ถูกบันทึกซึ่งไม่ซิงค์กัน ยกเลิกการตรวจสอบและซิงค์อีกครั้ง

คำถามสำหรับผู้ใช้ที่มีความรู้เพิ่มเติม: มีการอัปเดตหรือบางสิ่งในสัปดาห์ที่ผ่านมา (สำหรับ VS 2015) ที่ยกเลิกการซิงค์สถานะหรือไม่


3

ดูคำตอบนี้ซึ่งแก้ไขปัญหาเดียวกันสำหรับฉัน

โพสต์โดย Luis Mack เมื่อ 5/12/2553 เวลา 8:50 น. ฉันพบปัญหาเดียวกันแล้วสำหรับโครงการเฉพาะเมื่อรวบรวมบนเครื่อง 64 บิต การแก้ไขที่ SEEMS ให้ทำงานคือการปรับเปลี่ยนอักขระหนึ่งตัวในสตรีมรูปภาพด้วยตนเองทุกครั้งที่ผู้ใช้หรือตัวควบคุมฟอร์มถูกแก้ไขในตัวออกแบบ

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

เปลี่ยนไป

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

นั่นคือ00LjAuMC4wกลับไปที่0yLjAuMC4wที่ท้ายบรรทัด (00 กลับเป็น 0y)


1
สรุปสั้น ๆ ของลิงก์จะเป็นประโยชน์ @Shaul :)
— Marvin Thobejane

งดงาม. ขอบคุณการบรรยายสรุปจะเพิ่มเนื้อหาลงในความคิดเห็นของคุณ
— Marvin Thobejane

2

ในกรณีของฉันฉันใช้. exe ขนาดเล็กที่โหลด DLLs อ้างอิงผ่านทาง Reflection ดังนั้นฉันแค่ทำตามขั้นตอนเหล่านี้ซึ่งช่วยวันของฉัน:

จากคุณสมบัติโครงการบนตัวสำรวจโซลูชันที่แท็บสร้างฉันเลือกแผ่นเป้าหมายจาก x86


2

ในกรณีของฉันฉันใช้การทดสอบผ่าน MSTest และพบว่าฉันได้ปรับใช้ DLL 32 บิตและ 64 บิตไปยังไดเรกทอรีทดสอบ โปรแกรมได้รับการสนับสนุน DLL 64 บิตและทำให้ล้มเหลว

TL; DRตรวจสอบให้แน่ใจว่าคุณปรับใช้ DLLs 32 บิตเพื่อทดสอบเท่านั้น


2

เรามีปัญหาที่คล้ายกันและเราจัดการเพื่อแก้ไขได้โดยการตั้งค่าเป้าหมายแพลตฟอร์มเป็น x86 คุณสมบัติโครงการ -> สร้าง


ดังนั้น x86 ที่กำลังแตกต่างจาก x64? มีวิธีตรวจจับสิ่งนี้ในไฟล์ dll ที่อ้างอิงหรือไม่?
— NoBugs

@Nobobugs ดูเหมือนว่าคุณจะทำได้ ดูที่กระทู้
— Joe

1

ฉันได้รับการแก้ไขปัญหานี้ในแบบ 'Windows' หลังจากตรวจสอบการตั้งค่าทั้งหมดของฉันทำความสะอาดโซลูชันและสร้างใหม่ฉันเพียงปิดโซลูชันแล้วเปิดใหม่ จากนั้นก็ใช้งานได้ดังนั้น VS อาจไม่ได้กำจัดสิ่งใดระหว่างการทำความสะอาด เมื่อวิธีการแก้ปัญหาเชิงตรรกะไม่ทำงานฉันมักจะหันไปหาคนที่ไร้เหตุผล (หรือดูเหมือนไร้เหตุผล) Windows ไม่ทำให้ฉันผิดหวัง :)


1

ฉันสามารถแก้ไขปัญหานี้ได้โดยจับคู่บิลด์เวอร์ชันของฉันกับเวอร์ชัน. NET บนเซิร์ฟเวอร์

ฉันคลิกสองครั้ง. exe เพียงเพื่อดูว่าจะเกิดอะไรขึ้นและมันบอกให้ฉันติดตั้ง 4.5 ....

ดังนั้นฉันปรับลดรุ่นเป็น 4.0 และใช้งานได้!

ดังนั้นตรวจสอบให้แน่ใจว่าเวอร์ชันของคุณตรงกัน มันวิ่งบนกล่อง dev ของฉันได้ดี แต่เซิร์ฟเวอร์มีเวอร์ชั่น. NET ที่เก่ากว่า


1

ในกรณีของฉันมันเป็นเนื้อหาที่ผิดของไฟล์ DLL ถูกดาวน์โหลดจากเว็บ แต่เนื้อหาของ DLL เป็นหน้า HTML: D ลองตรวจสอบว่าเป็นไฟล์ไบนารีหรือไม่หากดูเหมือนว่าถูกต้อง DLL :)


1

เราพบปัญหาเดียวกันใน. NET core ทางออกคือการดาวน์โหลดรันไทม์. netcore 32 บิตและมีเป้าหมายโครงการของคุณx86

ในcsprojไฟล์ของคุณเพิ่ม

  <PropertyGroup>
    <PlatformTarget>x86</PlatformTarget>  
  </PropertyGroup>

  <PropertyGroup>
    <RunCommand Condition="'$(PlatformTarget)' == 'x86'">$(MSBuildProgramFiles32)\dotnet\dotnet</RunCommand>    
  </PropertyGroup>

สิ่งนี้ใช้สำหรับเครื่อง Windows คุณต้องปรับพา ธ และเช่นสำหรับ Linux / OSX


0

หากคุณกำลังนำเข้า DLL ที่ไม่มีการจัดการให้ใช้

CallingConvention = CallingConvention.Cdecl 

ในวิธีการนำเข้า DLL ของคุณ


0

1: ไปที่: เครื่องมือ> ตัวเลือก> โครงการและโซลูชัน> โครงการบนเว็บ> ใช้ IIS Express รุ่น 64 บิต 2: เปลี่ยนการตั้งค่าด้านล่างสำหรับโครงการบริการเว็บ ป้อนคำอธิบายรูปภาพที่นี่

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