, nico-pyright(c) on me demande souvent comment créer un wrapper C++/CLI ...
Je vais, dans ce post, vous guider dans la création d'un tel wrapper.
Pour l'exemple, je vais utiliser la très bonne bibliothèque de compression en .Cab, créée par Elmue sur CodeProject.
Cette bibliothèque possède une version C++ et une version .Net, cette dernière ayant été créé avec le Managed C++ de Visual Studio 2002, je vais vous montrer comment on peut encapsuler la version C++ pure dans un wrapper C++/CLI afin de l'utiliser avec vos projets .Net.
Vous devez être identifié pour poster un commentaire.
, nico-pyright(c) Suite à une question, voici un exmple pour passer un tableau de wchar_t d'une DLL C à une application managée (C# par exemple).
Vous devez être identifié pour poster un commentaire.
, nico-pyright(c) Une nouveauté dans visual studio 2008 est l'utilisation du template marshal_as pour faire du marshaling.
Incomplète encore à l'heure actuelle, retrouvez le blog dédié à son enrichissement à cette adresse : http://www.marshal-as.net/
Vous pouvez également envoyer vos contributions à Kate Gregory
Vous devez être identifié pour poster un commentaire.
, nico-pyright(c) Je viens de mettre à jour mon tutoriel sur l'intéropérabilité où j'expose une manière plus simple de mettre à jour une structure C native par référence depuis un programme C#.
Vous devez être identifié pour poster un commentaire.
, nico-pyright(c) Je vous présente la deuxième partie de mon tutoriel d'introduction à l'intéropérabilité.
Vous apprendrez comment utiliser des structures C plus ou moins complexes dans un programme C#. Vous apprendrez aussi comment fonctionne COM Interop ainsi que le hosting de CLR afin d'utiliser des objets .Net dans une application native.
Aller au tutoriel d'introduction à l'intéropérabilité (partie 2)
Bonne lecture
Vous devez être identifié pour poster un commentaire.
, nico-pyright(c) Somasegar nous informe de l'orientation stratégique de Visual C++.
Comme on pouvait s'en douter, les priorités s'articulent autour de :
Des perspectives pour le C++/CLI, langage roi de l'intéropérabilité... et pour tout ce qui est natif, le C++ reste le langage de premier choix.
Vous devez être identifié pour poster un commentaire.
, nico-pyright(c) Des fois, il peut etre utile de pouvoir intercepter une exception managée à partir d'un code natif.
Soit le programme suivant qui simule, grace aux pragma unmanaged et managed, une intéraction entre un code natif et un code managé :
using namespace System;
void fonctionManagee()
{
throw gcnew Exception("Exception managée");
}
#pragma unmanaged
void fonctionNative()
{
fonctionManagee();
}
#pragma managed
int main()
{
fonctionNative();
return 0;
}
Vous devez être identifié pour poster un commentaire.
On vient de me poser une question :
je veux utiliser cette structure en C dans mon programme C#
typedef struct
{
int val;
int telfixe[10][2];
} MASTRUCTURETEL;
j'ai un peu modifié l'exemple pour que ce soit plus simple, mais la question porte sur le tableau à deux dimensions.
Alors, comment faire ?
Vous devez être identifié pour poster un commentaire.
, nico-pyright(c) Le billet précédent présente une méthode qui simplifie grandement l'écriture de notre programme natif qui utilise un objet managé via COM Interop.
La contrainte qu'il rajoute est la transformation des signatures des méthodes à la sauce COM.
Ainsi, une méthode :
String^ ReadLine();
sera wrappée en
HRESULT ReadLine(/*[out,retval]*/ BSTR);
Ce qui suggère l'utilisation de la macro SUCCEEDED pour tester la bonne marche de la fonction.
Mais pouvons-nous encore simplifier et se passer de ce type de signature ? On aimerait pouvoir avoir une signature du genre :
BSTR ReadLine();
Bref, conserver la signature de la méthode, aux types près ...
Vous devez être identifié pour poster un commentaire.
, nico-pyright(c) Si vous êtes allé au bout du précédent billet, je vous félicite. Je rappelle que le but est de pouvoir utiliser un objet .net depuis notre exe natif pur et de passer des paramètres à son constructeur via un wrapper CLI.
Quand je re-regarde le code du billet, il me fait peur
Tout ce code pour finalement si peu de choses...
N'y aurait-il pas moyen de faire plus simple ?
Forcément, si j'écris ca, c'est qu'il doit y avoir un moyen...
Vous devez être identifié pour poster un commentaire.
Si la question est : "Peut-on passer des paramètres au constructeur d'un objet COM qui fait le wrapper d'une classe managée ?"
La réponse est non !
Alors, comment faire par exemple si je veux utiliser la classe System::IO::StreamReader (par exemple) depuis mon programme natif ?
Vous devez être identifié pour poster un commentaire.
, nico-pyright(c) Pour continuer avec COM Interop, je vais vous montrer comment passer des paramètres à une méthode.
soit la classe CLI suivante :
Vous devez être identifié pour poster un commentaire.
| Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
Copyright © 2000-2012 - www.developpez.com