Est-il possible de partager des références aux objets C# entre les codes C# et C++ sans complexité massive? Ou est-ce généralement considéré comme une mauvaise idée?Partage d'objets entre les codes C# et C++
Répondre
La meilleure solution pour partager un objet C# entre code natif et managé consiste à utiliser COM interop. Cela vous permet de partager essentiellement une interface d'un objet entre le code managé et sa signature équivalente en C++.
En ce qui concerne la complexité des choses. La majorité des scénarios d'interopérabilité COM sont simples et ne sont pas plus complexes que la bonne vieille programmation COM. Sur le plan géré, il ne ressemble vraiment pas à une interface normale. Une fois que vous introduisez plusieurs threads ou commencez à jouer entre les appartements COM, les choses peuvent être un peu compliquées. D'après mon expérience, la façon la plus simple d'obtenir ce résultat est la suivante.
- Définir une interface en C# que vous souhaitez utiliser dans
- C++ Mark l'interface avec le ComVisible (true) attrbute
- Run tlbexp sur l'ensemble qui génère un fichier TLB
- Importer le TLB dans votre projet natif
Cela donnera la définition de l'interface dans vos deux projets. Comment passer cela entre les projets nécessite un peu plus de détails dans votre architecture.
Une autre solution que je peux recommander, par expérience personnelle, est d'utiliser une interface C++ managée entre les deux si le code C++ auquel vous voulez accéder est trop grand ou trop complexe. Par exemple, j'utilise la bibliothèque réseau RakNet C++ dans un projet C#. Les solutions consistent à créer une classe wrapper massive en C# pour accéder aux fonctions C++ requises, créer une enveloppe C++ autour de ces fonctions qui peuvent être utilisées comme interopérabilité COM ou utiliser C++ managé (Visual C++/CLI).
J'ai choisi ce dernier qui me permet d'utiliser C++ pour accéder à la bibliothèque RakNet, mais les classes créées peuvent être utilisées directement dans un autre projet .NET comme si. La logique principale a donc été créée dans ces classes managées en C++, ce qui me permet également d'utiliser le framework .NET et certaines de ses merveilleuses fonctionnalités. Dans mon projet C# j'ai simplement besoin d'appeler la bibliothèque Managed C++ qui me fournit toutes les 20 fonctions dont j'ai besoin pour tout faire.
- 1. Différence entre les codes d'état et les codes d'erreur
- 2. Interop entre C++ et C#
- 3. Partage de mémoire entre deux processus (C, Windows)
- 4. Valeur synchronisée entre C# et C++?
- 5. Interaction entre Java et C#
- 6. Temps de trajet entre les codes postaux
- 7. Partage de code entre swfs
- 8. Partage de l'authentification entre ASP.NET et WordPress
- 9. Partage de mémoire entre CGImageRef et UIImage
- 10. Partage de ressources entre frères et sœurs
- 11. profil Partage et rôles informations entre les applications web
- 12. différence entre les expressions lambda et les méthodes anonymes - C#
- 13. Différences entre les interfaces Java et les protocoles Objective-C?
- 14. Partage de l'authentification entre les sites ASP.NET
- 15. Différences entre Java et C# et .NET
- 16. distance entre 2 codes postaux
- 17. Quelle est la différence entre% c et% C dans printf?
- 18. Quelle est la différence entre C et Embedded C?
- 19. Transmission de données entre l'application C++ (MFC) et C#
- 20. Transfert de données d'image entre C# et C++
- 21. Incident de mode d'ouverture de fichier entre C# et C++
- 22. Quelle est la différence entre les méthodes anonymes (C# 2.0) et les expressions lambda (C# 3.0)?
- 23. Communication interprocessus entre l'application C# et l'application C++ non gérée
- 24. LINQ: Différence entre 'Sélectionnez c' et 'Select nouvelle (c ...'
- 25. Méthodes de partage d'instances de classe entre les processus
- 26. C# et Regex: Comment extraire les chaînes entre guillemets
- 27. Conversion entre les types gérés et non gérés en C++?
- 28. En-têtes C++ - séparation entre l'interface et les détails d'implémentation
- 29. Différence dans les hachages SHA entre ruby et C#
- 30. différences entre StringBuilder en Java et C#