2009-07-12 10 views
4

Juste après être passé de XP à Vista, j'ai réalisé que mes programmes C# ne fonctionnaient pas.LoadLibrary échoue sous Vista x64

Voici la situation: J'ai écrit une DLL C++ que j'utilise dans mon application C#. La DLL fonctionnait correctement sous XP, mais lorsque je suis passée à Vista, elle ne fonctionnait plus en C#. Je l'ai testé en Delphi, fonctionne très bien, mais C# - non.

J'ai écrit du code supplémentaire pour faciliter mon contrôle en C#.

 if (LoadLibrary("blowfish.dll") == 0) 
     { 
      Misc.LogToFile("error", true); 
      Application.Exit(); 
     } 

Il n'a pas besoin de temps d'exécution C++, parce que son compilé avec les bibliothèques et il fonctionne dans Delphi sur Vista, mais pas C#.

Où le problème pourrait-il être?

Merci d'avance.

+1

Est-ce Vista x86 ou x64? –

+0

Vista x64.La DLL est compilée pour x32. –

+0

Est-ce le problème? –

Répondre

11

Sur la plate-forme x64, le JIT compilera votre programme en x64, puisque votre C++ natif est compilé en x86, il échouera à le charger.
Vous devez indiquer explicitement le JIT compiler votre programme pour x86, vous pouvez le faire en utilisant CorFlags ou les paramètres du projet définir le type de CPU x86 (sous construction/cible de plate-forme)

+0

Merci, cela a résolu mon problème! –

2

Shay a la solution rapide - faire votre application entière 32 bits de sorte qu'il fonctionne sous WOW64. Cependant, la meilleure solution consiste à reconstruire votre DLL C++ en tant que code 64 bits afin que votre programme entier puisse s'exécuter nativement sur le système d'exploitation 64 bits.

1

Si vous compilez normalement, le CLR exécutera votre application en tant que 64 bits sur Windows x64 et 32 ​​bits sur Windows x86. Vous devez charger l'image native correcte pour la plate-forme. Une solution consiste à faire ce que Shay a suggéré et à forcer votre application à s'exécuter dans un CLR 32 bits.

Vous pouvez également faire en sorte que votre application examine la taille du pointeur natif et charge l'image native correcte.

string blowfishdll = "blowfish.dll"; 
// detect 64-bit installations by looking at the native pointer size 
if(64 == IntPtr.Size * 8 ) 
    blowfishdll = "blowfish-x64.dll" 

if (LoadLibrary(blowfishdll) == 0)   
{ 
    Misc.LogToFile("error", true);    
    Application.Exit();   
} 
Questions connexes