2012-09-01 14 views
27

Ho un progetto in C# che utilizza la libreria C++ e alcune DLL. Quando lo eseguo funziona alla grande.Il modulo doveva contenere un manifest assembly

La biblioteca è Awesomium, contiene sia libreria C++ e C# wrapper

Quando creo riferimento a questo progetto dal mio progetto ASP.NET MVC 4 ricevo il seguente errore:

Dettagli eccezione: System.BadImageFormatException: impossibile caricare file o assembly 'file: /// D: \ Projects \ Development \ ProGamers \ GamingSite \ bin \ avcodec-52.dll' o una delle sue dipendenze. Il modulo avrebbe dovuto contenere un manifest assembly.

cose che ho provato:

  1. Affrontare le DLL, ma ancora non funziona (Il file esiste).

  2. Registrarlo nel GAC ma ho lo stesso errore lì.

  3. Assicurarsi di utilizzare .NET Framework 4.0 (e non il profilo del cliente)

  4. 2 files with the same dll/exe name causing conflict - Non ho essa.

  5. Change the platform of the solution a AnyCPU/Piattaforme miste.

dello stack:

[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

è possibile ottenere un registro dall'associazione con il [Visualizzatore registro binding di assembly] (http://msdn.microsoft.com/en-us/library/e74a18c4.aspx)? Assicurati di impostare prima le impostazioni su Log all binds. – rene

+0

Assembly.LoadFrom() non può funzionare su una DLL come avcodec-52.dll, non è un assembly .NET. Perché il tuo codice tenta di caricarlo in questo modo non è completamente chiaro se non si pubblica uno snippet. –

+0

Hans I non ha usato Assembly manualmente, e ha funzionato benissimo in un'applicazione console. Rende solo problemi solo quando faccio riferimento alla mia applicazione ASP.NET. E l'unico uso che sto facendo è fare riferimento alle dll di Awesomium. http://awesomium.com –

risposta

7

BadImageFormatException, nella mia esperienza, è quasi sempre a che fare con 86 contro le assemblee x64 compilati. Sembra che il tuo assembly C++ sia compilato per x86 e tu stia girando su un processo x64. È corretto?

Invece di utilizzare AnyCPU/Mixed come piattaforma. Prova a impostarlo manualmente su x86 e verifica se verrà eseguito successivamente.

Spero che questo aiuti.

+1

La mia macchina è x86 e l'assembly C++ è probabilmente anche x86. Ho provato a impostare entrambi i progetti manualmente su x86, ma non ha funzionato .. –

+0

Questo ha risolto il mio problema. Apparentemente il mio assembly è stato compilato per x86 e non ha apprezzato la compilazione in un progetto x64. –

33

Ho scoperto che sto utilizzando un InstallUtil diverso dal mio .NET Framework di destinazione. Sto costruendo un .NET Framework 4.5, nel frattempo si è verificato l'errore se sto usando la versione di .NET Framework 2.0. Avendo usato il giusto InstallUtil per il mio .NET Framework di destinazione, ho risolto questo problema!

1

Ho trovato un'altra strana ragione e ho pensato che forse un altro sviluppatore si fosse confuso come me. Ho eseguito install.bat creato per installare il mio servizio nel prompt dei comandi dello sviluppatore di VS2010 ma il mio servizio è stato generato in VS2012. stava andando a questo errore e mi fa impazzire ma provo gli strumenti VS2012 Developer Prompt e tutto è andato per essere OK. Non so perché, ma il mio problema è stato risolto. quindi puoi testarlo e se qualcuno ne conosce la ragione, per favore condividi con noi. Grazie.

1

Verificare se manifest è un file xml valido. Ho avuto lo stesso problema facendo un comando di copia DOS alla fine della compilazione, e si scopre che per qualche motivo non riesco a capire che "copia" aggiungeva uno strano carattere (->) alla fine dei file manifest. Il problema è stato risolto aggiungendo l'opzione "/ b" per forzare la copia binaria.

1

Prima prova ad aprire il file con un decompilatore come ILSpy, la tua DLL potrebbe essere corrotta. Ho avuto questo errore su un sito Web online, quando ho scaricato la DLL e ho provato ad aprirlo, era danneggiato, probabilmente si è verificato qualche errore durante il caricamento via ftp.

Problemi correlati