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


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.