2


1

Utiliser une DLL 32 bits dans une application 64 bits avec .Net 2.0

J’ai besoin d’utiliser une COM-DLL d’une entreprise externe (donc je n’ai pas de code source) qui ne fonctionne qu’avec l’option de compilation CPU-Target x86.

Mais mon programme est un programme "Any CPU" et je ne veux pas changer cela.

J’ai donc beaucoup lu et consulté Google et découvert que j’avais besoin de 2 processus qui communiquent avec IPC et WCF.

Le problème: WCF n’est pas disponible avec .Net Framework 2.0.

Alors, quelle est la meilleure et la plus simple façon de le faire sans changer la cible CPU de mon programme principal?

3 Answer


3


Si vous avez une DLL cible x86, que ce soit un assembly .Net ou une DLL native, vous devez * héberger * cette DLL dans un processus 32 bits - dans le cas de .Net, cela signifie sélectionner la plate-forme x86, sinon votre DLL échouera à charger sur une machine 64 bits.

Si vous * devez absolument * avoir un processus 64 bits lorsque cela est possible, votre seul véritable moyen d’utiliser cette DLL sera de créer un processus externe 32 bits qui "héberge" la DLL et communique avec votre processus 64 bits principal via IPC (communication interprocessus ). WCF n’est qu’une méthode de communication entre les processus - elle n’est pas disponible dans .Net 2.0, mais vous pouvez toujours utiliser d’autres méthodes telles que .Net remoting.

Cependant, tout cela sera difficile à implémenter et à maintenir - à moins que vous n’ayez une * très * bonne raison de simplement compiler votre application avec la plate-forme x86, au moins jusqu’à ce que la société externe publie une version 64 bits.


1


Si vous ne voulez pas changer votre assembly en "x86", vous devez utiliser une forme d’IPC, dont WCF n’est qu’un. Une autre option consiste à utiliser des canaux nommés pour communiquer entre les deux processus.


0


Dans le passé, j’ai toujours écrit un wrapper .NET pour les DLL COM et C ++ et l’ai placé dans sa propre bibliothèque de classes.

Le wrapper peut gérer tous les appels d’interopérabilité à la DLL.

Il vous permet également d’effectuer des conversions de données et des rapports d’erreurs qui seraient significatifs pour les deux parties (votre application NET et la DLL COM).

Je pense que cela devrait résoudre votre problème.

ÉDITER

En fait, j’ai réfléchi plus loin et le processus ci-dessus ne fonctionnera pas. En effet, les processeurs cibles X86, x64 et Itanium sont fondamentalement différents.

  • édité * x64 est capable d’exécuter du code ciblé x86, tout comme Itanium (qui utilisait un émulateur et maintenant une extension EM64T)

Cependant, vous pouvez exécuter votre DLL x86 dans un processus distinct et implémenter une certaine forme de communication entre eux. Je suppose que c’est pourquoi vous avez mentionné WCF. Je dis cela parce que le logiciel x86 devrait fonctionner sur un système x64.

Cela signifierait que votre solution aurait deux exécutables, un x86 et un AnyCPU, car un assemblage ne peut être ciblé que sur un seul type de CPU.