System.BadImageFormatException: ไม่สามารถโหลดไฟล์หรือแอสเซมบลี (จาก installutil.exe)


105

ฉันพยายามติดตั้งบริการ Windows โดยใช้ InstallUtil.exe และได้รับข้อความแสดงข้อผิดพลาด

System.BadImageFormatException: ไม่สามารถโหลดไฟล์หรือแอสเซมบลี ' {xxx.exe}' หรือการอ้างอิงอย่างใดอย่างหนึ่ง มีความพยายามในการโหลดโปรแกรมที่มีรูปแบบไม่ถูกต้อง

สิ่งที่ช่วยให้?


แก้ไข: (ไม่ใช่ตาม OP) ข้อความแบบเต็มที่ดึงมาจาก dup ทำให้ได้รับความนิยมมากขึ้น [สำหรับ googleability]:

C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319> InstallUtil.exe C: \ xxx.exe Microsoft (R) .NET Framework ยูทิลิตี้การติดตั้งเวอร์ชัน 4.0.30319.1 ลิขสิทธิ์ (c) Microsoft Corporation สงวนลิขสิทธิ์.

เกิดข้อยกเว้นขณะเริ่มต้นการติดตั้ง: System.BadImageFormatException: ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'file: /// C: \ xxx.exe' หรือการอ้างอิงอย่างใดอย่างหนึ่ง มีความพยายามในการโหลดโปรแกรมที่มีรูปแบบไม่ถูกต้อง ..

คำตอบ:


154

รายละเอียดเพิ่มเติมเพื่อความครบถ้วนเผื่อว่าจะช่วยใคร ...

โปรดทราบว่าสาเหตุที่พบบ่อยที่สุดสำหรับข้อยกเว้นนี้ในปัจจุบันคือการพยายามโหลด/platform:x86DLL เฉพาะ 32 บิตลงในกระบวนการที่เป็น 64 บิตหรือในทางกลับกัน (เช่นโหลด/platform:x64DLL เฉพาะ 64 บิต ( ) ลงในกระบวนการที่เป็น 32 บิต) หากคุณplatformไม่เจาะจง ( /platform:AnyCpu) สิ่งนี้จะไม่เกิดขึ้น (สมมติว่าไม่มีการอ้างอิงที่อ้างอิงเป็นบิตที่ไม่ถูกต้อง)

กล่าวอีกนัยหนึ่งคือวิ่ง:

% windir% \ Microsoft.NET \ Framework \ v2.0.50727 \ installutil.exe

หรือ:

% windir% \ Microsoft.NET \ Framework 64 \ v2.0.50727 \ installutil.exe

จะไม่ทำงาน (แทนที่ในเวอร์ชันเฟรมเวิร์กอื่น ๆ : v1.1.4322(32 บิตเท่านั้นปัญหานี้จึงไม่เกิดขึ้น) และv4.0.30319ตามที่ต้องการในด้านบน)

เห็นได้ชัดว่าตามที่กล่าวถึงในคำตอบอื่น ๆ เราจะต้องมีหมายเลขเวอร์ชันinstallutil.

สุดท้ายโปรดทราบว่าใน Visual Studio 2010 เครื่องมือจะเริ่มต้นในการสร้างไบนารี x86 ( แทนที่จะเป็นCPU ใด ๆตามที่เคย )

รายละเอียดที่สมบูรณ์ของ System.BadImageFormatException (การบอกว่าสาเหตุเดียวคือความขมขื่นที่ไม่ตรงกันคือการทำให้เกินขนาดขั้นต้น!)

อีกเหตุผลหนึ่งสำหรับBadImageFormatExceptionการติดตั้งx64ภายใต้โปรแกรมติดตั้งx64คือใน Visual Studio 2010 .vdprojประเภทโครงการติดตั้งเริ่มต้นจะสร้างInstallUtilLibshim แบบ 32 บิตแม้ในระบบ x64 (ค้นหา "การกระทำแบบกำหนดเองที่มีการจัดการ 64 บิตจะทำให้ข้อยกเว้น System.BadImageFormatException" บน หน้า).


ฉันมีปัญหาเดียวกันเมื่อฉันเริ่มแก้ไขข้อบกพร่องตามที่คุณกล่าวไว้ข้างต้นฉันพบว่า Platform: ถูกตั้งค่าเป็น x86 เมื่อฉันเปลี่ยนเป็น CPU ใด ๆ มันก็ใช้งานได้ :)
Atta H.

ฉันมีโปรแกรมติดตั้ง windows ของฉันที่มีการดำเนินการแบบกำหนดเอง การตั้งค่าของฉันจำเป็นต้องทำงานบนระบบ x64 ดังนั้นคุณสมบัติการดำเนินการแบบกำหนดเองจึงต้องตรวจสอบตัวเลือก "Run64Bit" ตามความเป็นจริง มันช่วยแก้ปัญหาของฉันได้
Hagen

16

ตรวจสอบให้แน่ใจว่า Framework ใหม่ล่าสุด (ที่คุณรวบรวมแอพของคุณด้วย) เป็นอันดับแรกใน PATH นั่นช่วยแก้ปัญหาให้ฉันได้ (พบในฟอรัม )


ลิงก์นั้นดูเหมือนจะหายไป ไม่น่าแปลกใจเลย 6 ปีที่แล้ว.
Al Lelopath

3
นี่คือที่ Archive.org web.archive.org/web/20100527204545/http://www.issociate.de/…
Epaga

9

ฉันคิดว่าคุณกำลังใช้เครื่องมือเวอร์ชัน 64 บิตเพื่อติดตั้งแอปพลิเคชัน 32 บิต ฉันประสบปัญหานี้ในวันนี้และใช้เส้นทาง Framework นี้เพื่อตอบสนอง

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

และควรติดตั้งแอปพลิเคชัน 32 บิตของคุณได้ดี


นั่นคือสถานการณ์สำหรับฉัน คำตอบที่เป็นประโยชน์มาก
Simos Fasouliotis

อย่างน้อยเชื่อมโยงคำตอบเดิม: stackoverflow.com/revisions/5229405/1
crusy

8

กุญแจสำคัญคือการตั้งค่าการตั้งค่าตัวประมวลผลที่ตรงกันสำหรับโครงการซึ่งมีอยู่สองที่

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

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

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

สำหรับ VS2013 แต่อาจเหมือนกันสำหรับเวอร์ชันอื่น ๆ ด้วย

อัปเดต - สำหรับ VS2019:

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


นี่เป็นวิธีที่ถูกต้องในการแก้ไขข้อผิดพลาดนี้ นั่นคือถ้าคุณไม่ต้องการยุ่งกับไฟล์ csproj ที่อาจเป็นร้อย ๆ ไฟล์
Bizhan

7

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

ฉันใช้ Visual Studio 2010 Express ฉันเขียนบริการทดสอบที่ไม่ได้ทำอะไรเลยจริงๆ มันเป็นเพียงการฝึกฝนสำหรับของจริงในภายหลัง

ฉันเขียนบริการและพยายามติดตั้งโดยใช้installutil.exeและได้รับข้อผิดพลาดต่อไปนี้:

System.BadImageFormatException: ไม่สามารถโหลดไฟล์หรือแอสเซมบลี '{filename.exe}' หรือการอ้างอิงอย่างใดอย่างหนึ่ง มีความพยายามในการโหลดโปรแกรมที่มีรูปแบบไม่ถูกต้อง

จนถึงตอนนี้เหมือนกับผู้เขียนต้นฉบับ

การสังเกตของ Rubenด้านบนเกี่ยวกับเอาต์พุต 32 บิตของ Visual Studio 2010 คือตัวช่วยที่นี่

ฉันใช้เวอร์ชัน 64 บิตinstallutil.exeและแน่นอนว่าผลลัพธ์ของ Visual Studio 2010 build เป็นแบบ 32 บิต เพียงเพื่อเพิ่มมูลค่าเพิ่มเล็กน้อยที่นี่คุณสามารถหารุ่น 32 บิตของกรอบ NET ล่าสุดและที่เกี่ยวข้องinstallutil.exeในC: \ Windows \ Microsoft.NET \ กรอบโฟลเดอร์ การใช้เวอร์ชันนี้installutil.exeแก้ไขปัญหาของฉัน บริการติดตั้งโดยไม่มีปัญหา!

ฉันหวังว่านี่จะช่วยคนอื่นได้


ฉันไม่รู้ว่าคุณหมายถึงอะไรในเวอร์ชัน 32 บิต แต่ฉันลองใช้ที่นี่แล้วและไม่ได้ผล C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727
user2568374

3

หลังจากลองใช้วิธีแก้ไขปัญหาที่กล่าวมาทั้งหมดแล้วฉันพบว่ามีการPlatformTargetเพิ่มลงในAnyCPUการกำหนดค่าในโครงการของฉัน. csproj

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>

การลบบรรทัดได้ผลสำหรับฉัน


ในกรณีของฉันที่ฉันต้องการสร้าง 64 บิตหนึ่งในโหนด PropertyGroup ไม่มีโหนด <PlatformTarget> x64 </PlatformTarget> ดังนั้นจึงน่าจะเป็นค่าเริ่มต้นเป็น 32 บิตและทำให้เกิดข้อผิดพลาดในรูปแบบภาพที่ไม่ถูกต้อง เมื่อฉันเพิ่มโหนดที่หายไปนี้ในกลุ่มคุณสมบัติข้อผิดพลาดก็หายไป
Tom Regan

พยายามแก้ปัญหานี้จะนำไปสู่ปัญหาอื่นสำหรับผมซึ่งเป็นappSettings app.config ไม่ถูกโหลดในช่วง Runtime แม้จะมีไฟล์ config ถูกนำเสนอในไดเรกทอรีออก อย่างไรก็ตามหลังจากลองใช้แนวทางของ zar ( Processor Architecture for AnyCPU Projects) ทุกอย่างก็เริ่มทำงานอีกครั้ง
Bizhan

1

ฉันมีปัญหานี้กับโครงการ WinForms โดยใช้ VS 2015 วิธีแก้ปัญหาของฉันคือ:

  1. คลิกขวาที่โครงการ
  2. เลือกคุณสมบัติ
  3. เลือก "ต้องการ 32 บิต"
  4. เป้าหมายแพลตฟอร์ม: CPU ใด ๆ

0

ฉันมีปัญหาเดียวกัน ฉันใช้คำสั่งมาตรฐานสำหรับการดำเนินการ เรียกว่า X64 ro รันกับการทดสอบ X86 ฉันต้องการระบุ X86 ไม่ใช่รุ่น X64 ของ nunit-runner


0

สรุปแล้วทั้ง Build และ Project \ Build \ Platform จะต้องถูกตั้งค่าเป็น x64 เพื่อที่จะติดตั้งบริการ 64 บิตบนระบบ 64 บิตได้สำเร็จ


0

ปัญหาของฉันแตกต่างออกไป เหตุการณ์นี้เกิดขึ้นหลังจากการปิดเครื่อง windows 7 โดยไม่คาดคิด ฉันใช้วิธีแก้ปัญหาที่สะอาดและมันก็วิ่งตามที่คาด


0

ในกรณีที่มีข้อความนี้ในการทดสอบการถ่ายทอดสดแต่ไม่ได้อยู่ในการทดสอบหน่วย$(SolutionDir)\.vs\$(SolutionName)\lut\0\0\x64\Debug\ก็เพราะประกอบที่เลือกจะถูกคัดลอกในการบินไปยัง แต่บางครั้งก็ไม่สามารถเลือกชุดประกอบบางส่วนได้เช่น VC ++ dlls ในกรณีของโปรเจ็กต์ c ++ / c # ที่ทำงานร่วมกัน

หลังการสร้าง xcopyไม่สามารถแก้ไขปัญหาได้เนื่องจากไฟล์ที่คัดลอกจะถูกลบโดยเครื่องมือทดสอบแบบสด

วิธีแก้ปัญหาเฉพาะในปัจจุบัน (28 ธ.ค. 2018) คือหลีกเลี่ยงการทดสอบสดและทำทุกอย่างในการทดสอบหน่วยด้วยแอตทริบิวต์ [TestCategory("SkipWhenLiveUnitTesting")]ใช้กับคลาสทดสอบหรือวิธีการทดสอบ

จุดบกพร่องนี้มีให้เห็นใน Visual Studio 2017 ถึง 15.9.4 และจำเป็นต้องได้รับการแก้ไขโดยทีม Visual Studio


0

Target build x64 Target Server Hosting IIS 64 Bit

คลิกขวาที่ appPool โฮสติ้งที่เรียกใช้เว็บไซต์ / เว็บแอปพลิเคชันและตั้งค่าเปิดใช้งานแอปพลิเคชัน 32 บิต = false

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


0

ฉันได้เผชิญกับปัญหานี้ในวันนี้ ในกรณีของฉันแอปพลิเคชันของฉัน(มีการอ้างอิงถึง dll 64 บิต)เป้าหมายของแพลตฟอร์มถูกตั้งค่าเป็นAnyCPUแต่Prefer 32-bit กล่องกาเครื่องหมายภายใต้ส่วนเป้าหมายแพลตฟอร์มถูกเลือกโดยค่าเริ่มต้น นี่เป็นปัญหาและทำงานได้ดีหลังจากยกเลิกการตรวจสอบPrefer 32-bitตัวเลือก


0

เราพบวิธีแก้ปัญหาที่แตกต่างกันสำหรับปัญหาที่มีอาการเดียวกัน:

เราเห็นข้อผิดพลาดนี้เมื่อเราอัปเดตโครงการจาก. net 4.7.1 เป็น 4.7.2

ปัญหาคือแม้ว่าเราจะไม่ได้อ้างถึง System.Net.Http อีกต่อไปในโปรเจ็กต์ แต่ก็ถูกระบุไว้ในส่วน dependAssembily ของ web.config ของเรา การลบสิ่งนี้และการอ้างอิงแอสเซมบลีอื่น ๆ ที่ไม่ได้ใช้ออกจาก web.config ช่วยแก้ปัญหาได้


0

ปัญหาคือทุกคนSystem.BadImageFormatException: Could not load file or assemblyรวมทั้งคนที่ไม่เกี่ยวข้องกับinstallutil.exeทุกประเด็นในเธรดนี้

  1. หากปัญหาของคุณเกี่ยวข้องกับWindowsBaseหรือPresentationFramework dlls และคุณได้ติดตั้งตัววิเคราะห์ตรวจสอบให้แน่ใจว่าได้ติดตั้งไว้สำหรับโครงการทั้งหมดในโซลูชันของคุณหรือไม่มีเลย

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

  2. อ้างอิงกรอบงานทั้งหมดใน.csprojไฟล์ของไลบรารีของคุณไม่ใช่แค่สองอย่างdlls:

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>Library</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <RazorLangVersion>3.0</RazorLangVersion>
        <UseWpf>True</UseWpf>
      </PropertyGroup>
  3. ลบbinและobjdirs, การแก้ปัญหาการทำความสะอาดและสร้าง

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