Domanda
Ho un C # (.NET 3.5, VS2005 Professional) applicazione che utilizza la libreria a 32 bit non gestito scritto in C / C ++. API che uso è simile a questo:
void * Initialize (int x);
voic GetData (void *);
E questo funziona quando l'eseguo su Windows XP a 32 bit, ma su Windows XP64bit getta eccezione:
Eccezione non gestita: System.Reflection.TargetInvocationException: eccezione è stata generata dalla destinazione di una chiamata. ---> System.BadImageFormatException: Si è tentato di caricare un programma con un formato non corretto. (Eccezione da HRESULT: 0x8007000B) a Aktuelizator.CommonLibrary.InitializeRingBuffer (Int32 dim) a Aktuelizator.AktuelizatorWService.AktuelizatorWS..ctor ()
Questi non gestito il lavoro di DLL sotto 64bit XP quando chiamato da 32bit unmanages writetn applicazioni in C / C ++.
Qualcuno ha qualche idea?
Soluzione
Il tuo Piattaforma configurazione di generazione è impostata su 'Qualsiasi CPU', che significa su un sistema operativo a 64 bit viene eseguito come 64 bit e non è possibile caricare la DLL. Impostare invece a 86, questo costringerà a correre come a 32 bit a prescindere dal sistema operativo e la DLL caricherà bene.
Altri suggerimenti
Sembra che la DLL viene compilata solo a 32 bit, ma si tenta di chiamare da entrambi a 32 bit e di processo a 64 bit. Il primo funziona, naturalmente. Più tardi, però, non lo faranno. 32 DLL bit possono essere utilizzati solo in 32 processi bit. Provare a compilare la DLL a un target a 64 bit e lasciare che il C # app usare quello.
Controlla tutti i parametri che sono definiti come Int32, che dovrebbe in realtà essere IntPtr.