J'ai un projet en c # qui utilise la bibliothèque c ++ et quelques dll. Quand je le lance ça marche très bien.
La bibliothèque est Awesomium , contient les bibliothèques c ++ et c # wrappers
Lorsque je crée une référence à ce projet à partir de mon projet ASP.NET MVC 4, le message d'erreur suivant s'affiche:
Détails des exceptions: System.BadImageFormatException: impossible de charger le fichier ou le fichier d'assembly: /// D:\Projects\Development\ProGamers\GamingSite\bin\avcodec-52.dll 'ou l'une de ses dépendances. Le module devait contenir un manifeste de l’Assemblée.
Choses que j'ai essayées:
Copier les dll, mais cela ne fonctionne toujours pas (le fichier existe).
L'enregistrement dans le GAC mais j'ai la même erreur ici.
Assurez-vous d'utiliser .NET Framework 4.0 (et pas le profil du client)
2 fichiers avec le même nom dll/exe provoquant un conflit - Je ne l’ai pas.
Changez la plate-forme de la solution en AnyCPU/Mixed Platforms.
Trace de la pile:
[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
J'ai constaté que j'utilise un InstallUtil différent de celui de mon .NET Framework cible. Je construis un .NET Framework 4.5, mais l'erreur s'est produite si j'utilise la version .NET Framework 2.0. Avoir utilisé le bon InstallUtil pour ma cible .NET Framework, a résolu ce problème!
BadImageFormatException
, selon mon expérience, concerne presque toujours les assemblys compilés x86 par rapport aux assemblages x64. On dirait que votre assembly C++ est compilé pour x86 et que vous utilisez un processus x64. Est-ce exact?
Au lieu d'utiliser AnyCPU/Mixed
comme plate-forme. Essayez de le définir manuellement sur x86
et voyez s'il sera exécuté après cela.
J'espère que cela t'aides.
Essayez d’abord d’ouvrir le fichier avec un décompilateur tel que ILSpy, votre dll est peut-être corrompue. J'ai eu cette erreur sur un site Web en ligne, lorsque j'ai téléchargé la DLL et essayé de l'ouvrir, elle était corrompue. Une erreur s'est probablement produite lors du téléchargement via FTP.
J'ai trouvé une autre raison étrange et je pensais que peut-être un autre développeur confus que moi. J'ai exécuté install.bat, créé pour installer mon service dans l'invite de commande developer de VS2010, mais mon service a été généré dans VS2012. il allait à cette erreur et me rend fou, mais j’essaie les outils VS2012 Developer Command Prompt et tout est bien passé. Je ne sais pas pourquoi mais mon problème a été résolu. afin que vous puissiez le tester et si quelqu'un sait la raison de cela s'il vous plaît partager avec nous. Merci.
Vérifiez si le manifeste est un fichier XML valide. J'ai eu le même problème en faisant une commande de copie DOS à la fin de la construction, et il s'avère que pour une raison quelconque, je ne peux pas comprendre que "copie" ajoutait un caractère étrange (->) à la fin des fichiers manifeste. Le problème a été résolu en ajoutant "/ b" switch pour forcer la copie binaire.