2010-12-02 5 views
4

J'ai écrit un assemblage C++/CLI en mode mixte, qui enveloppe une bibliothèque C++ native. Il compile avec succès. Je peux écrire une application C++/CLI qui utilise cet assemblage, donc je sais que cela fonctionne. J'ai donc écrit une application C# qui utilise le même assemblage C++/CLI. Cela compile aussi bien. Mais quand j'essaie de l'exécuter, j'obtiens "BadImageFormatException", avec le message d'exception détaillé ci-dessous.Comment puis-je appeler un assembly C++/CLI en mode mixte à partir de C#?

Je pense que cette exception se produit parce que mon assembly est en mode mixte et donc "dangereux". Mais d'après ce que j'ai lu, même les assemblages dangereux sont censés être fiables lorsqu'ils sont exécutés à partir du disque dur local, ce que je fais.

Quelqu'un peut-il m'aider à comprendre ce qui se passe ici? Est ce que j'essaye de faire même possible?

exception détaillée message:

 
System.BadImageFormatException was unhandled 
    Message="Could not load file or assembly 'asillyclass, Version=1.0.3988.20325, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format." 
    Source="ConsoleApplication1" 
    FileName="asillyclass, Version=1.0.3988.20325, Culture=neutral, PublicKeyToken=null" 
    FusionLog="=== Pre-bind state information === 
: User = SIG\\user 
: DisplayName = asillyclass, Version=1.0.3988.20325, Culture=neutral, PublicKeyToken=null\n (Fully-specified) 
: Appbase = file:///C:/projects/API/TestApp-C#/ConsoleApplication1/bin/Debug/ 
: Initial PrivatePath = NULL 
assembly : ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null. 
=== 
: This bind starts in default load context. 
: Using application configuration file: C:\\projects\\API\\TestApp-C#\\ConsoleApplication1\\bin\\Debug\\ConsoleApplication1.vshost.exe.config 
: Using machine configuration file from C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\config\\machine.config. 
: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
: Attempting download of new URL file:///C:/projects/API/TestApp-C#/ConsoleApplication1/bin/Debug/asillyclass.DLL. 
: Failed to complete setup of assembly (hr = 0x8007000b). Probing terminated. 
" 
    StackTrace: 
     at ConsoleApplication1.Program.Main(String[] args) 
     at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

Répondre

9

La cause la plus probable est que vous utilisez un système d'exploitation 64 bits, et il y a un décalage 32/64 bits (par exemple, la DLL est 32 bits et l'application est 64 bits/AnyCPU). Pour corriger, accédez aux propriétés de votre application et sélectionnez x86 au lieu de AnyCPU.

+1

Microsoft a vraiment besoin de corriger ce message d'erreur, car pratiquement tous les programmeurs C++/CLI y sont au moins une fois. Cela n'aurait pas dû être si difficile à inclure "Le processus en cours est' x86_64' mais la bibliothèque ne peut être chargée que dans un '' environnement "x86 (32 bits)". (Ou 'Itanium', ou' ARM' ou 'MIPS' si vous avez essayé de charger une DLL conçue pour WinCE) –

+1

Cela a été quelque peu atténué, simplement parce que beaucoup de gens y ont été confrontés. Les recherches Google affichent la réponse assez rapidement. VS2010 utilise par défaut x86 pour les applications au lieu de AnyCPU. Cela dit, si vous ouvrez un problème de connexion, je vais l'augmenter. :) –

+0

Merci! Cela a aidé, bien que ce que j'ai réellement fait était de recompiler la DLL pour cibler x64. Je ne peux pas trouver le paramètre "Target Platform" dans les propriétés de l'application pour une raison quelconque? Est-il possible que l'édition Express de Visual C# n'expose pas ce paramètre, ou est-ce que je le manque juste? –

Questions connexes