Utiliser une DLL C/C++ en C#

LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 - 15 mars 2012 à 11:11
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 - 21 mars 2012 à 10:58
Bonjour,

J'ai l'intention de refaire un ancien programme C++ en C#
(je débute en C#)
Or, avant de me lancer dans la bataille, je voudrais m'assurer de la faisabilité de la chose: en effet, dans mon programme C++ j'utilise des DLL
développées aussi en C/C++.
En cherchant un peu sur le net j'ai trouvé l'utilisation de P/Invoke (DllImport etc...)
Je n'utilise qu'une seule fonction de la dll à importée or celle-ci prends beaucoup de paramètres et c'est là que j'ai peur que ça coince, voici la fonction en question:
 int solve(
int LOG,
double TIME,
int T_PRE,
int T_MEAN,
int N_BUR,
int N_ALT,
int N_SYN,
double ALPHA,
int N_MAX_BLOCKS,
double W_SP_TOT,
double W_SP_ZON,
double W_PO_TOT,
double W_PO_ZON,
double W_CP,
int *BUR_ZO,
double *BUR_PO,
int *BUR_DC,
int *BUR_UP,
int *BUR_DO,
int **ALT_CP,
int **SYN_CP,
int **BUR_SD,
double *TOT_PO, 
int *T_NEXT
);



Y a t'il des gens expérimentés pouvant m'aider et me renseigner sur la faisabilité de porter mon code en C# ?
merci d'avance.

 

8 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
16 mars 2012 à 07:43
faisabilité... oui

gaffe a une bonne correspondance des types utilisés ;

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
16 mars 2012 à 10:28
Ok, merci.

Effectivement en cherchant plus hier je me suis rendu compte qu'il y avait des moyens de faire avec du code unsafe ou autre...

Je recherche le meilleur moyen, et justement j'ai bien identifié que la correspondance des types poserait surement problème, ce qui me fait le plus peur bien entendu sont les pointeurs de pointeurs d'entier.
Débutant en C#, je ne sais pas comment faire et je n'ai rien trouvé sur "google"
saurais tu m'aider via un exemple concret , STP?

 
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
16 mars 2012 à 11:01
ce genre de choses :
http://stackoverflow.com/questions/2026228/c-marshalling-a-pointer-to-an-int-array-from-a-sendmessage-lparam

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
16 mars 2012 à 11:10
Whouha pas sûr de bien comprendre l'exemple.


 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
16 mars 2012 à 11:31
on reserve une plage memoire, on y place/lit nos données

tu ne pourras pas exploiter directement un tableau d'entiers .Netisés

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
16 mars 2012 à 11:44
Ok c'est plus clair déjà, merci.

 Bon, je pense que cela sera fastidieux d'utiliser la méthode de ma DLL C++
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
21 mars 2012 à 03:14
Salut,

En unsafe tu peux utiliser des pointeurs et des pointeurs sur pointeur.

Il est possible de prendre l'adresse d'un tableau ou d'un élément d'un tableau là ou il faut bien faire attention c'est que le garbage collector déplace les objets, il existe le mot clé "fixed" qui dit au compilo "ne bouge pas le tableau j'utilise son adresse."

Le mot clé "stackalloc" alloue de la mémoire fixe sur la pile (pour les petits tableaux bien sûr).

La classe Marshal possède des méthodes pour allouer de la mémoire dans le tas non managé, donc de la mémoire qui ne sera pas déplacée par le garbage collector.

exemple en unsafe et pure managé :

http://www.csharpfr.com/forum/sujet-CHERCHE-EQUIVALENT-CSHARP-ON-PEUT-FAIRE_1327951.aspx
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
21 mars 2012 à 10:58
Ok super merci!

Je vais regarder cela avec attention

 
0