System.BadImageFormatException: Không thể tải tệp hoặc lắp ráp (từ installutil.exe)


104

Tôi đang cố cài đặt dịch vụ Windows bằng InstallUtil.exe và nhận được thông báo lỗi

System.BadImageFormatException: Không thể tải tệp hoặc lắp ráp ' {xxx.exe}' hoặc một trong các phụ thuộc của nó. Đã cố gắng tải một chương trình có định dạng không chính xác.

Đưa cái gì?


CHỈNH SỬA: (Không phải bởi OP) Toàn bộ thông báo được trích xuất từ ​​trùng lặp giúp tăng thêm lượt truy cập [cho googleability]:

C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319> InstallUtil.exe C: \ xxx.exe Tiện ích cài đặt Microsoft (R) .NET Framework Phiên bản 4.0.30319.1 Bản quyền (c) Microsoft Corporation. Đã đăng ký Bản quyền.

Đã xảy ra ngoại lệ khi khởi tạo cài đặt: System.BadImageFormatException: Không thể tải tệp hoặc tập tin lắp ráp ': /// C: \ xxx.exe' hoặc một trong các phụ thuộc của nó. Đã cố gắng tải một chương trình có định dạng không chính xác ..

Câu trả lời:


154

Một số chi tiết khác để hoàn thiện trong trường hợp nó giúp ai đó ...

Lưu ý rằng lý do phổ biến nhất cho ngoại lệ này những ngày này là cố gắng tải một /platform:x86DLL 32 bit cụ thể ( ) vào một quy trình 64 bit hoặc ngược lại (viz. Tải một /platform:x64DLL 64 bit cụ thể ( ) vào một quy trình 32 bit). Nếu của bạn platformlà không cụ thể ( /platform:AnyCpu), điều này sẽ không phát sinh (giả sử không có phụ thuộc được tham chiếu nào có bitness sai).

Nói cách khác, chạy:

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

hoặc là:

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

sẽ không hoạt động (thay thế trong các phiên bản khung công tác khác: v1.1.4322(chỉ 32 bit, vì vậy vấn đề này không phát sinh) và v4.0.30319như mong muốn ở trên).

Rõ ràng, như đã đề cập trong câu trả lời khác, người ta cũng sẽ cần số phiên bản .NET của phiên bản installutilbạn đang chạy> = (tốt nhất là =) của tệp EXE / DLL mà bạn đang chạy trình cài đặt.

Cuối cùng, lưu ý rằng trong Visual Studio 2010, công cụ sẽ mặc định tạo các tệp nhị phân x86 ( thay vì Bất kỳ CPU nào như trước đây ).

Chi tiết đầy đủ về System.BadImageFormatException (nói rằng nguyên nhân duy nhất là bittedness không khớp thực sự là một sự đơn giản hóa quá mức!).

Một lý do khác cho một BadImageFormatExceptiondưới x64 cài đặt là trong Visual Studio 2010, loại .vdprojCài đặt dự án mặc định tạo ra một InstallUtilLibmiếng đệm 32-bit , ngay cả trên hệ thống x64 (Tìm kiếm "Hành động tùy chỉnh được quản lý 64-bit ném ngoại lệ System.BadImageFormatException" vào trang).


Tôi đã gặp vấn đề tương tự, khi tôi bắt đầu gỡ lỗi theo những gì bạn nói ở trên, tôi thấy rằng Nền tảng: được đặt là x86. Khi tôi thay đổi nó thành Bất kỳ CPU nào, nó đã hoạt động :)
Atta H.

Tôi có trình cài đặt windows của mình với các Hành động tùy chỉnh. Thiết lập của tôi cần chạy trên hệ thống x64, vì vậy thuộc tính Hành động tùy chỉnh phải kiểm tra tùy chọn "Run64Bit" có đúng không. Nó đã giải quyết vấn đề của tôi.
Hagen


9

Tôi nghĩ rằng bạn đang sử dụng phiên bản 64 bit của công cụ để cài đặt ứng dụng 32 bit. Tôi cũng phải đối mặt với vấn đề này ngày hôm nay và sử dụng đường dẫn Khung này để phục vụ.

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

và nó sẽ cài đặt ứng dụng 32-bit của bạn tốt.


Đó là viễn cảnh đối với tôi. Câu trả lời rất hữu ích.
Simos Fasouliotis

Ít nhất hãy liên kết câu trả lời ban đầu: stackoverflow.com/revisions/5229405/1
crushy

8

Điều quan trọng là đặt cài đặt bộ xử lý phù hợp cho dự án ở hai nơi.

nhập mô tả hình ảnh ở đây

Và cũng đảm bảo rằng cài đặt kiến ​​trúc giống nhau trong menu Kiểm tra >> Cài đặt kiểm tra >> Kiến trúc bộ xử lý mặc định >> như hiển thị bên dưới.

nhập mô tả hình ảnh ở đây

Điều này dành cho VS2013 nhưng cũng có thể tương tự cho các phiên bản khác.

Cập nhật - Đối với VS2019:

nhập mô tả hình ảnh ở đây


Đây là cách chính xác để sửa lỗi này. Đó là, nếu bạn không muốn lộn xộn với hàng trăm tệp csproj.
Bizhan

6

OK, đây là vấn đề tôi gặp phải, và những gì đã khắc phục nó, có vẻ rất liên quan đến vấn đề ở trên.

Tôi đang sử dụng Visual Studio 2010 Express. Tôi đã viết một dịch vụ thử nghiệm mà không thực sự làm được gì cả. Nó chỉ là thực hành cho những điều thực sự sau đó.

Tôi đã viết dịch vụ và cố gắng cài đặt nó bằng cách sử dụng installutil.exevà gặp lỗi sau:

System.BadImageFormatException: Không thể tải tệp hoặc lắp ráp '{filename.exe}' hoặc một trong các phụ thuộc của nó. Đã cố gắng tải một chương trình có định dạng không chính xác.

Cho đến nay vẫn giống như tác giả gốc.

Quan sát của Ruben ở trên về đầu ra 32 bit của Visual Studio 2010 là vị cứu tinh ở đây.

Tôi đã sử dụng phiên bản 64-bit của installutil.exevà chắc chắn, đầu ra của bản dựng Visual Studio 2010 là 32-bit. Chỉ cần thêm một chút giá trị bổ sung ở đây, bạn có thể tìm thấy phiên bản 32-bit của .NET framework mới nhất và được liên kết installutil.exetrong thư mục C: \ Windows \ Microsoft.NET \ framework . Sử dụng phiên bản này của sự installutil.execố đã khắc phục sự cố của tôi; dịch vụ được cài đặt mà không gặp khó khăn!

Tôi hy vọng điều này sẽ giúp ai đó khác ngoài đó.


Tôi không biết ý bạn là gì về phiên bản 32-bit nhưng tôi đã thử phiên bản ở đây và nó không hoạt động C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727
user2568374

3

Sau khi thử tất cả các giải pháp được đề cập, tôi tìm thấy PlatformTargetbằng cách nào đó được thêm vào AnyCPUcấu hình trong dự án của tôi .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>

Xóa dòng đã làm việc cho tôi.


Trong trường hợp của tôi, khi tôi muốn bản dựng 64 bit, một trong các nút PropertyGroup bị thiếu nút <PlatformTarget> x64 </PlatformTarget>, vì vậy có lẽ nó đang được đặt mặc định là 32 bit và gây ra lỗi định dạng hình ảnh xấu. Khi tôi thêm nút bị thiếu này vào nhóm thuộc tính, lỗi đã biến mất.
Tom Regan

Việc thử giải pháp này dẫn đến một vấn đề khác đối với tôi, đó là appSettings của app.config không được tải trong thời gian chạy mặc dù tệp cấu hình có trong thư mục đầu ra . tuy nhiên, sau khi thử cách tiếp cận của zar ( Processor Architecture for AnyCPU Projects) mọi thứ bắt đầu hoạt động trở lại.
Bizhan

1

Tôi gặp sự cố này với Dự án WinForms sử dụng VS 2015. Giải pháp của tôi là:

  1. nhấp chuột phải vào Dự án
  2. chọn tài sản
  3. chọn "Ưu tiên 32-bit"
  4. Mục tiêu nền tảng: Bất kỳ CPU nào

0

Tôi gặp vấn đề tương tự. Tôi sử dụng lệnh tiêu chuẩn để thực thi. Nó đang gọi X64 ro chạy chống lại các bài kiểm tra X86. Tôi cần chỉ định X86 chứ không phải phiên bản X64 của nunit-runner.


0

Tóm lại, cả Build và Project \ Build \ Platform đều phải được đặt thành x64 để cài đặt thành công dịch vụ 64 bit trên hệ thống 64 bit.


0

Vấn đề của tôi khác. Điều này xảy ra sau khi máy windows 7 của tôi bị tắt đột ngột. Tôi đã thực hiện một giải pháp sạch và nó chạy như mong đợi.


0

Trong trường hợp có thông báo này trong các bài kiểm tra trực tiếp , nhưng không có trong các bài kiểm tra đơn vị , đó là vì các cụm được chọn được sao chép nhanh chóng $(SolutionDir)\.vs\$(SolutionName)\lut\0\0\x64\Debug\. Nhưng đôi khi không thể chọn một số hợp ngữ , ví dụ: VC ++ dlls trong trường hợp dự án Interop c ++ / c #.

Hậu tạo xcopysẽ không khắc phục được sự cố vì tệp đã sao chép sẽ bị xóa bởi công cụ kiểm tra trực tiếp.

Cách giải quyết duy nhất cho đến nay (ngày 28 tháng 12 năm 2018) là tránh các bài kiểm tra Trực tiếp và thực hiện mọi thứ trong bài kiểm tra đơn vị với thuộc tính [TestCategory("SkipWhenLiveUnitTesting")]được áp dụng cho lớp kiểm tra hoặc phương pháp kiểm tra.

Lỗi này được nhìn thấy trong bất kỳ Visual Studio 2017 nào lên đến 15.9.4 và cần được giải quyết bởi nhóm Visual Studio.


0

Target build x64 Target Server Hosting IIS 64 Bit

Nhấp chuột phải vào appPool lưu trữ chạy trang web / ứng dụng web và đặt kích hoạt ứng dụng 32 bit = false.

nhập mô tả hình ảnh ở đây


0

Tôi đã phải đối mặt với vấn đề này ngày hôm nay. Trong trường hợp của tôi, mục tiêu nền tảng của ứng dụng của tôi (có tham chiếu đến dll 64-bit) được đặt thành AnyCPUnhưng Prefer 32-bit hộp kiểm trong phần mục tiêu nền tảng được chọn theo mặc định. Đây là sự cố và hoạt động tốt sau khi bỏ Prefer 32-bitchọn tùy chọn.


0

Chúng tôi đã tìm thấy một giải pháp khác cho một vấn đề có cùng một triệu chứng:

Chúng tôi đã gặp lỗi này khi cập nhật dự án từ .net 4.7.1 lên 4.7.2.

Vấn đề là mặc dù chúng tôi không tham chiếu đến System.Net.Http nữa trong dự án, nhưng nó vẫn được liệt kê trong phần dependAssembily của web.config của chúng tôi. Xóa phần này và bất kỳ tham chiếu assembly không sử dụng nào khác khỏi web.config đã giải quyết được sự cố.


0

Vấn đề là mọi System.BadImageFormatException: Could not load file or assemblybao gồm cả những cái không được liên kết với installutil.exetất cả đều trỏ đến chính chủ đề này.

  1. Nếu vấn đề của bạn liên quan đến WindowsBasehoặc PresentationFramework dlls và bạn đã cài đặt các bộ phân tích, hãy đảm bảo đã cài đặt chúng cho tất cả các dự án trong giải pháp của bạn hoặc không cài đặt chúng.

    nhập mô tả hình ảnh ở đây

  2. Tham khảo toàn bộ khung trong .csprojtệp thư viện của bạn thay vì chỉ hai khung dlls:

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>Library</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <RazorLangVersion>3.0</RazorLangVersion>
        <UseWpf>True</UseWpf>
      </PropertyGroup>
  3. Loại bỏ binobjdirs, làm sạch dung dịch và xây dựng lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.