# Guide du C++ pour .NET Programmation

Guide de Programmation en C++ pour .NET Chapitre 2 : Programmation en C++ pour .NET :
| << Chapitre 1 : Configuration de Visual Studio .NET | retour au sommaire >> |

# L'absence des char*

Les chaînes de caractères sont très utilisées en C++, mais inexistantes en. NET. Il existe pour cela la classe String, qui doit remplacer l'utilisation des char*. Des méthodes de conversion de l'un à l'autre sont donc disponibles, notamment grâce à la classe Marshal.
Ces méthodes étant statiques, leur appel est assez pénible à taper et surtout peu lisible, surtout si la tâche est très répétitive. Les paragraphes suivants proposeront donc de créer des MACROS pour rendre votre code bien plus lisible.
On notera que cela n'est faisable qu'en C++ pour. NET, et pas en C# car ce dernier langage est dépourvu de macro (en C# la classe Marshal est bien sûr toujours utilisable).

## Conversion des char* en String*

La méthode statique PtrToStringAnsi de la classe Marshal va réaliser la conversion d'un char * en String *. Le code suivant en est un exemple, (la valeur 256 correspond à la taille maximale de votre chaîne initiale, vous pouvez modifier ce paramètre):
Il est fortement conseillé de créer une Macro dans un fichier header :
Ainsi l'utilisation de la classe Marshal est simplifiée

## Conversion des String* en char*

De même, La méthode statique StringToHGlobalAnsi de la classe Marshal va réaliser la conversion d'un String * en char *. Cet appel nécessite une libération en utilisant la méthode FreeHGlobal.
De la même façon que précédemment, on pourra créer des macros :
et les utiliser ainsi :

# Les structures de données .NET ou non

Les structures « non gérées » (ou en franglais « non managées ») sont du domaine du C++ classique, donc sans plate-forme .NET, et donc inaccessibles à partir de classes C#.
Les structures « gérées » (ou en franglais « managées »), quant à elles, sont des éléments qui pourront être accessibles.
Le C++ pour .NET permet une utilisation des deux types de structures de données. Il est donc nécessaire dans ce langage de déclarer explicitement qui est géré et qui ne l'est pas, grâce aux mots-clé __gc et __nogc.

## Déclarer une classe __gc ou __nogc

Une classe « gérée » sera déclarée ainsi :
De même pour une classe « non gérée » :

## Déclarer un enum __gc ou ___nogc

De la même manière on déclare un type énuméré avec __gc pour « géré » et __nogc pour « non géré »:

## Déclarer un tableau __gc ou __nogc

De la même manière on déclare un tableau avec __gc pour « géré » et __nogc pour « non géré »:

# Les bibliothèques .NET ou non
## L'ordre d'inclusion des bibliothèques (libraries)

Quelques ambiguïtés malheureuses peuvent apparaître si le principe suivant n'est pas respecté :
l'inclusion des fichiers header « non gérés » est PRIORITAIRE
Sinon vous risquez de voir apparaître des erreurs au milieu de fichiers sources inconnus, dont la signification est incohérente.
Par exemple, un cas récurrent comme l'inclusion de "window.h" peut poser ce genre de problème.
Pour éclaircir votre code et éviter cette erreur, il est conseillé de créer un fichier header uniquement dédié à réaliser les inclusions dans le bon ordre.
Par exemple :
Ainsi chaque fichier .cpp pourra inclure uniquement ce dernier fichier header, à condition que celui-ci soit toujours mis à jour.
Exemple :
Pour plus d'information à propos de cette bizarrerie, voir le document correspondant dans la MSDN