2012-09-01 14 views
27

Tôi có một dự án trong C# sử dụng thư viện C++ và một số dll. Khi tôi chạy nó nó hoạt động rất tốt.Mô-đun được mong đợi chứa một biểu hiện lắp ráp

Thư viện là Awesomium, chứa cả C++ thư viện và C# wrappers

Khi tôi tạo ra tài liệu tham khảo cho dự án này từ dự án ASP.NET MVC 4, tôi nhận được lỗi sau:

Ngoại lệ chi tiết: System.BadImageFormatException: Không thể tải tập tin hoặc tập tin 'tập tin: /// D: \ Projects \ Phát triển \ ProGamers \ GamingSite \ bin \ avcodec-52.dll' hoặc một trong những phụ thuộc của nó. Các mô-đun được dự kiến ​​sẽ chứa một biểu hiện lắp ráp.

Những điều tôi đã cố gắng:

  1. Đối phó dlls, nhưng nó vẫn không hoạt động (Các tập tin tồn tại).

  2. Đăng ký nó trong GAC nhưng tôi gặp lỗi tương tự ở đó.

  3. Hãy chắc chắn rằng sử dụng .NET Framework 4.0 (và không phải khách hàng hồ sơ)

  4. 2 files with the same dll/exe name causing conflict - Tôi không có nó.

  5. Change the platform of the solution cho AnyCPU/nền tảng hỗn hợp.

Stack Trace:

[BadImageFormatException: Could not load file or assembly 'file:///D:\Projects\Development\ProGamers\GamingSite\bin\avcodec-52.dll' or one of its dependencies. The module was expected to contain an assembly manifest.] 
    System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0 
    System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +34 
    System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +152 
    System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark) +102 
    System.Reflection.Assembly.LoadFrom(String assemblyFile) +34 
    WebActivator.ActivationManager.Run() +190 

[InvalidOperationException: The pre-application start initialization method Run on type WebActivator.ActivationManager threw an exception with the following error message: Could not load file or assembly 'file:///D:\Projects\Development\ProGamers\GamingSite\bin\avcodec-52.dll' or one of its dependencies. The module was expected to contain an assembly manifest..] 
    System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore(ICollection`1 methods, Func`1 setHostingEnvironmentCultures) +550 
    System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods) +132 
    System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath) +90 
    System.Web.Compilation.BuildManager.ExecutePreAppStart() +135 
    System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +516 

[HttpException (0x80004005): The pre-application start initialization method Run on type WebActivator.ActivationManager threw an exception with the following error message: Could not load file or assembly 'file:///D:\Projects\Development\ProGamers\GamingSite\bin\avcodec-52.dll' or one of its dependencies. The module was expected to contain an assembly manifest..] 
    System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9850940 
    System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +101 
    System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +456 
+0

bạn có thể nhận nhật ký từ ràng buộc với [Trình xem nhật ký ràng buộc lắp ráp] không (http://msdn.microsoft.com/en-us/library/e74a18c4.aspx)? Đảm bảo đặt cài đặt trước để Ghi nhật ký tất cả các liên kết. – rene

+0

Assembly.LoadFrom() không thể hoạt động trên một DLL như avcodec-52.dll, nó không phải là một assembly .NET. Tại sao mã của bạn cố gắng tải nó như thế này là hoàn toàn không rõ ràng nếu bạn không đăng một đoạn mã. –

+0

Hans Tôi đã không sử dụng lắp ráp bằng tay, và nó làm việc tuyệt vời trong một ứng dụng giao diện điều khiển. Nó chỉ làm cho vấn đề chỉ khi tôi tham khảo nó từ ứng dụng ASP.NET của tôi. Và sử dụng duy nhất tôi đang làm là tham khảo các dlls Awesomium. http://awesomium.com –

Trả lời

7

BadImageFormatException, theo kinh nghiệm của tôi, là hầu như luôn luôn phải làm gì với x86 so với lắp ráp x64 biên soạn. Có vẻ như phiên bản C++ của bạn được biên dịch cho x86 và bạn đang chạy trên một tiến trình x64. Đúng không?

Thay vì sử dụng AnyCPU/Mixed làm nền tảng. Hãy thử đặt thủ công thành x86 và xem liệu nó có chạy sau đó hay không.

Hy vọng điều này sẽ hữu ích.

+1

Máy của tôi là x86 và C++ cũng có thể là x86. Tôi đã thử đặt cả hai dự án theo cách thủ công thành x86, nhưng nó không hoạt động .. –

+0

Việc này đã giải quyết được sự cố của tôi. Rõ ràng lắp ráp của tôi đã được biên dịch cho x86 và nó không đánh giá cao việc được biên soạn trong một dự án x64. –

33

Tôi thấy rằng, tôi đang sử dụng InstallUtil khác với .NET Framework mục tiêu của mình. Tôi đang xây dựng một Khuôn khổ .NET 4.5, trong khi đó lỗi xảy ra nếu tôi đang sử dụng bản phát hành .NET Framework 2.0. Có sử dụng InstallUtil đúng cho mục tiêu của tôi Khuôn khổ .NET, giải quyết vấn đề này!

1

Tôi đã tìm thấy một lý do khác lạ và tôi nghĩ có thể một nhà phát triển khác đã nhầm lẫn với tôi. Tôi đã chạy install.bat được tạo để cài đặt dịch vụ của tôi trong Dấu nhắc lệnh của nhà phát triển VS2010 nhưng dịch vụ của tôi được tạo trong VS2012. nó đã đi đến lỗi này và khiến tôi phát điên nhưng tôi thử các công cụ VS2012 Developer Command Prompt và mọi thứ đều ổn. Tôi không có lý do tại sao nhưng vấn đề của tôi đã được giải quyết. vì vậy bạn có thể kiểm tra nó và nếu có ai biết lý do đó hãy chia sẻ với chúng tôi. Cảm ơn.

1

Kiểm tra xem tệp kê khai có phải là tệp xml hợp lệ hay không. Tôi đã có cùng một vấn đề bằng cách thực hiện một lệnh sao chép DOS vào cuối của xây dựng, và nó chỉ ra rằng vì một lý do tôi không thể hiểu "sao chép" đã được thêm một ký tự lạ (->) ở phần cuối của tập tin manifest. Vấn đề đã được giải quyết bằng cách thêm "/ b" chuyển đổi để buộc sao chép nhị phân.

1

Trước tiên, hãy thử mở tệp bằng trình dịch ngược như ILSpy, dll của bạn có thể bị hỏng. Tôi đã có lỗi này trên một trang web trực tuyến, khi tôi tải về các dll và cố gắng để mở nó, nó đã bị hỏng, có lẽ một số lỗi đã xảy ra trong khi tải lên nó thông qua ftp.

Các vấn đề liên quan