Oui Mono.NET soutenir et compiler C++ / CLI?
Mono. net prend-il en charge et compile C++ / CLI?
Si ce n'est pas le cas, savez-vous s'ils ont l'intention de le soutenir?
7 réponses
Nous n'avons pas de compilateur pour C++ / CLI, ce serait une très grande entreprise pour une très petite base d'utilisateurs. Considérez également que la spécification C++/CLI est intrinsèquement défectueuse et non portable, donc être capable de la compiler n'aiderait pas beaucoup dans le cas général.
Vous pouvez compiler en utilisant le compilateur MS. net et exécuter en mono avec ces restrictions:
Exécuter avec mono sur n'importe quel système Si L'application C++ / CLI est pure gérée (mais alors, pourquoi utiliser un langage aussi laid et non C#?)
-
Exécuter avec mono sur windows dans les autres cas (les applications C++/CLI sont en général Non portables et incluent du code natif, de sorte qu'elles ne peuvent fonctionner que sur windows et sont inintéressantes pour l'objectif principal de mono qui est d'exécuter des programmes gérés sous Linux)
Notez que MS lui-même finira par abandonner C++ / CLI, alors n'investissez pas trop dessus et passez en C#.
Mono a récemment fait de grands progrès avec l'interopérabilité C++ dans CXXI .
De cette publication , La courte histoire est que la nouvelle technologie CXXI permet aux développeurs C#/. net de:
- consommez facilement les classes C++ existantes à partir de C# ou de tout autre. net langue
- instancier des objets C++ à partir de C #
- invoquer les méthodes C++ dans les classes C++ à partir du code C #
- Invoquer C++ inline méthodes de code C# (à condition que votre bibliothèque est compilée avec -fkeep-inline-fonctions ou que vous fournissez un substitut la bibliothèque)
- sous-Classe C++ classes de C #
- remplacer les méthodes C++ par des méthodes C #
- Expose les instances de classes C++ ou de classes C++/C# mixtes à la fois au code C# et au code C++ comme si elles étaient du code natif.
CXXI est le résultat de deux étés de travail de Google Summer of Code vers l'amélioration de L'interopérabilité de Mono avec le langage C++.
Mono est capable d'exécuter des assemblages 'purs' générés par C++/CLI, c'est-à-dire. ceux qui ne contiennent pas de code natif. Les différentes options / clr supportées par le compilateur C++ sont documentées sur MSDN .
Il n'y a actuellement aucun support pour compiler C++ / CLI. Il y a eu du travail sur la modification de GCC pour émettre IL, mais il n'est pas complet (et n'apparaît pas actif). Voir cet article .
Je ne crois pas que Microsoft documente le format pour inclure le code natif dans une assemblée, donc soutenir cela est difficile.
C'est une question très ancienne avec des réponses très intéressantes après quelques années.
En ce moment tritao / CppSharp est la fourchette la plus développée de mono / CXXI {[3] } qui a été déplacée vers le référentielmono en 2013 et est activement développée depuis, L'arbre actuel peut être trouvé à mono / CppSharp
Leur readme est ici et les caractéristiques pour le "générateur" sont:
- plusieurs backends: C++ / CLI et C# P / Invoke
- ABIs multiples: Itanium, MS, ARM, iOS et iOS64
- plusieurs plates-formes: Windows, OS X et Linux
- support de substitution de table virtuelle
- prise en charge de l'héritage Multiple
- sémantique facilement extensible via les passes Utilisateur
- prise en charge des travaux en cours pour STL (C++/CLI uniquement)
- API de personnalisation fortement typées et cartes de type
Il est également livré avec beaucoup de trucs AST cool et un analyseur.
Non, C++ / CLI est non pris en charge sous Mono et ne le sera probablement jamais bien que la génération d'IL pur en utilisant des compilateurs MS permettrait au code totalement géré de s'exécuter sous Mono.
En tant que langage interop, C++/CLI existe pour permettre d'appeler du code non géré. L'autre alternative utilise P / Invoke qui est bien documenté mais avec des problèmes.
Allez ici et regardez sous "Langues manquantes". Mais juste parce que vous ne compilez ne signifie pas que vous ne pouvez pas exécuter. Vous pouvez compiler votre code C++ en utilisant le SDK framework et essayer de l'exécuter en utilisant mono. La peine d'essayer de toute façon.