2009-04-16 8 views
3

J'ai une application C# (.NET 3.5, VS2005 Professional) qui utilise une bibliothèque 32 bits non gérée écrite en C/C++. API que j'utilise est comme ceci:code dll non géré

void * Initialize (int x);

voic GetData (void *);

Et cela fonctionne quand je le lance sur Windows XP 32 bits, mais il jette sur Windows XP64bit exception:

Exception non gérée: System.Reflection.TargetInvocationException: Exception a été levée par la cible d'un appel. ---> System.BadImageFormatException: Une tentative de chargement d'un programme avec un format incorrect a été effectuée. (Exception de HRESULT: 0x8007000B) à Aktuelizator.CommonLibrary.InitializeRingBuffer (Int32 dim) à Aktuelizator.AktuelizatorWService.AktuelizatorWS..ctor()

Ces travaux non géré DLL sous XP 64bit est appelé depuis 32 bits unmanages writetn d'application en C/C++.

Quelqu'un a-t-il une idée?

Répondre

2

Votre configuration de configuration Plate-forme est définie sur "Toute UC", ce qui signifie que sur un système d'exploitation 64 bits, il fonctionne en 64 bits et vous ne pouvez pas charger la DLL. Réglez-le à la place sur x86, cela le forcera à fonctionner en 32 bits quel que soit le système d'exploitation et votre dll se chargera très bien.

+0

Cela a résolu le problème! Merci! – Mita

1

Il semble que votre DLL ne soit compilée que sur 32 bits, mais vous essayez de l'appeler à la fois à partir d'un processus 32 bits et 64 bits. Le premier fonctionnera, bien sûr. Le plus tard, cependant, ne sera pas. Les DLL 32 bits ne peuvent être utilisées que dans des processus 32 bits. Essayez de compiler la DLL sur une cible 64 bits et laissez l'application C# utiliser celle-ci.

+1

Oui c'est le cas, mais cela fonctionne quand il est appelé depuis l'application compilée 32 bits sous XP64bit. Peut-il être fait sans recompiler DLL? – Mita

+0

Un exécutable 32 bits fonctionnant sur un système d'exploitation 64 bits pense qu'il fonctionne dans le monde 32 bits - Google "WOW64" pour plus d'informations. Essayez de lancer l'application à partir d'un environnement 32 bits, tel que C: \ Windows \ SysWOW64 \ cmd.exe, de sorte que le processus soit un 32 bits, comme la DLL. – eran

+0

BTW, ma suggestion s'applique au cas où vous devez faire avec l'application et la DLL que vous avez, par conséquent besoin d'une solution de contournement. Si vous pouvez reconstruire l'application, la solution de Stephen Martin résoudra le problème plutôt que de le contourner. – eran

0

Vérifiez tous les paramètres définis comme Int32, qui devraient être IntPtr.

+0

J'ai vérifié deux fois, cela n'a pas aidé – Mita