2010-05-28 7 views
3

J'ai créé une DLL en C++ en utilisant un projet de bibliothèque de classes dans Visual Studio. J'ai besoin d'appeler une méthode dans la DLL à partir d'une application C#.comment appeler une DLL C++ à partir du projet d'application C# windows

J'ai appris qu'il y a 2 approches. La première consiste à ajouter la référence de projet dll au projet C# ou à utiliser DllExport pour exporter la méthode. Cependant, lorsque j'ai essayé dans les deux sens, il donne toujours l'erreur suivante lorsque la méthode dll est appelée en cours d'exécution.

Une exception non gérée du type 'System.BadImageFormatException' s'est produite dans TestClient.exe Informations supplémentaires: Une tentative de chargement d'un programme avec un format incorrect a été effectuée. (Exception de HRESULT: 0x8007000B)

Puis-je savoir comment éviter ce problème?

Merci d'avance!

+0

Vous avez publié la conséquence (l'exception) mais pas la cause (votre code source). –

Répondre

5

Cette erreur signifie que vous essayez de charger une DLL 32 bits dans un processus 64 bits ou une DLL 64 bits dans un processus 32 bits. Sous Windows, la quantité de la DLL doit correspondre à la durée de vie du processus afin qu'il se charge correctement.

Votre DLL native est-elle 32 ou 64 bits? Dans vos paramètres de construction de projet C#, quelle plateforme ciblez-vous? Si vous allez dans les propriétés du projet C#, vous pouvez aller à l'onglet Construction et modifier la "cible de la plate-forme" en quelque chose de spécifique comme x86 ou x64 pour correspondre à la plate-forme pour laquelle votre DLL native a été construite.

L'autre alternative serait de construire la DLL native pour correspondre à la plate-forme de votre application C#. Si la plate-forme de l'application C# est AnyCPU, cependant, elle fonctionnera en 32 bits sur Windows 32 bits et 64 bits sur Windows 64 bits. À cause de cela, vous auriez besoin d'une version 32 et 64 bits de votre DLL native.

Je vous recommande de définir la plate-forme de votre application C# sur quelque chose de spécifique (x86, x64), puis de modifier la plate-forme de votre DLL native pour correspondre.

+0

J'utilise une machine 64 bits. Mais tous les projets sont dans la plate-forme 32 bits et je ne peux même pas changer la cible de la plate-forme dans le projet C++ dll autre que "Win 32". Dans les propriétés de projet C#, la cible de construction ne peut être définie que comme "n'importe quel CPU". Cependant, j'ai réussi à accéder aux méthodes dll à partir d'un service Web C#. J'ai ce problème lors de l'utilisation d'une application Windows C#. – chathuradd

+0

Pourquoi ne pouvez-vous pas changer le projet C# de AnyCPU? Quel genre de projet est-ce? Un projet AnyCPU sur une machine 64 bits s'exécutera en 64 bits. Lorsqu'il essaie de charger votre DLL C++ Win32 (32 bits), il échouera à l'exception de votre voir. Vous devez soit remplacer le projet C# par x86, soit modifier le projet DLL C++ par x64. –

+0

Désolé. J'ai regardé au mauvais endroit, il semble. oui je pourrais changer la plateforme en x86 en C#, donc maintenant l'exception n'est pas levée. Merci beaucoup :) – chathuradd

Questions connexes