2008-09-24 5 views
39

J'ai une application que nous essayons de migrer vers 64bit à partir de 32 bits. C'est .NET, compilé en utilisant les drapeaux x64. Cependant, nous avons un grand nombre de DLL écrites en FORTRAN 90 compilées pour 32bit. Les fonctions dans les DLL FORTRAN sont assez simples: vous mettez des données, vous sortez des données; aucun état d'aucune sorte. Nous n'y consacrons pas beaucoup de temps, peut-être 3% au total, mais la logique de calcul est inestimable. Puis-je appeler d'une manière ou d'une autre les DLL 32 bits à partir du code 64 bits? MSDN suggère que je ne peux pas, période. J'ai fait du simple piratage et vérifié cela. Tout renvoie une exception de point d'entrée non valide. La seule solution que j'ai trouvée jusqu'ici est de créer des wrappers COM + pour toutes les fonctions DLL 32 bits et d'appeler COM à partir du processus 64 bits. Cela semble tout à fait un mal de tête. Nous pouvons également exécuter le processus dans l'émulation WoW, mais le plafond de la mémoire ne sera pas augmenté, plafonnant autour de 1,6 Go.Appel code 32 bits à partir de 64 bits Processus

Existe-t-il un autre moyen d'appeler les DLL 32 bits à partir d'un processus CLR 64 bits?

Répondre

32

La dll 32 bits doit être chargée dans un processus 32 bits distinct et votre processus 64 bits doit communiquer avec elle via une communication interprocessus. Je ne pense pas qu'il soit possible de charger une DLL 32 bits dans un processus 64 bits autrement.

Il y a un très bon article ici:

Accessing 32-bit DLLs from 64-bit code

+0

C'est le 64bit -> COM -> 32bit chose que je décrivais. Après avoir lu cet article et essayé de faire fonctionner l'échantillon, j'ai décidé qu'il y aurait un meilleur moyen de le faire. Du moins je l'espère. –

+3

La réponse de John est correcte. Il n'y a aucun moyen de mélanger des modules 32 bits et 64 bits dans un processus. Vous devez commencer un deuxième processus. Voir aussi ma réponse ici: http://stackoverflow.com/questions/6523075/how-to-force-net-application-to-run-in-32bit-mode/6533556#6533556 –

+2

Vous n'avez pas nécessairement besoin d'utiliser Les wrappers COM +, mais vous devez utiliser un processus 32 bits. –

1

Vous devez écrire vos processus exécutables en tant que processus 32 bits (CPU ou par rapport Tout x64) de sorte qu'ils soient chargés de WOW32 pour Vue. Cela les chargera dans le mode d'émulation 32 bits et vous n'aurez pas le problème du point d'entrée. Vous pouvez laisser vos bibliothèques en mode AnyCPU, mais vos exécutables doivent être compilés en tant que x86.

+1

On dirait qu'ils ont envisagé cela, mais ont besoin de l'augmentation du plafond de la mémoire Offres 64 bits –

+0

La moitié est vraie: les processus 32 bits s'exécutent sur une machine x64 si vous les compilez en tant que x86. Mais si votre exécutable est x86 et vos bibliothèques sont AnyCPU - le compilateur juste à temps en sortira du code x64 ce qui les rendra incompatibles avec l'exécutable (32 bits). Donc, ** tout ce qui inclut les assemblages ** doit être x86 ou AnyCPU. – Matt

0

La réponse de John est correcte si vous ne voulez pas recompiler vos DLL existantes; Cependant, cela pourrait être une option pour vous aussi.

Notre équipe migre actuellement notre code FORTRAN x86 vers x64 pour augmenter le plafond de la mémoire.

+0

cela fonctionne aussi longtemps que vous n'avez pas d'assemblages tiers 32 bits (sans le code source), vous devez ajouter comme référence ... – Matt

Questions connexes