Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1420 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] Faire une seule instance de dll pour deux programmes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C#] Faire une seule instance de dll pour deux programmes

n°1884645
Vings
Thèse, Antithèse, Charentaises
Posté le 14-05-2009 à 15:46:52  profilanswer
 

Bonjour tout le monde.
Dans le cadre de mon stage je dois réaliser une interface c# qui doit communiquer avec un logiciel embarqué réalisé en c++.  
Pour faire communiquer les deux, j'ai choisi de faire une Dll en c++ afin que les deux programmes puissent lire/écrire dessus et par ce biais, s'échanger des données.
Les deux programmes lisent/utilisent bien la dll, il n'y a pas d'accroc là dessus. En revanche; les modifications de l'un des programme sur la dll, n'est pas perçue par l'autre et vice et versa. J'en déduis donc qu'il y a deux instances en mémoire de cette dll, alors qu'il n'en faudrait qu'une.
 
Je précise que j'ai lié les deux programmes (l'un en c++; l'autre en c#) de manière implicite.
 
Si vous avez des idées... Merci d'avance  :D


---------------
"Il faut avoir bien du jugement pour sentir que nous n'en avons point."  
mood
Publicité
Posté le 14-05-2009 à 15:46:52  profilanswer
 

n°1884662
Vings
Thèse, Antithèse, Charentaises
Posté le 14-05-2009 à 16:04:46  profilanswer
 

Je vais utiliser la méthode explicite (dynamique par des pointeurs) en espérant qu'avec des pragma data seg, cela marche.

n°1884677
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 14-05-2009 à 16:38:31  profilanswer
 

Euh... alors déjà, ta dll, elle est développée en quel langage ?
Comment l'appelles tu en C++ ? en C# ?
Quand tu dis "les modifications de l'un des programme sur la dll, n'est pas perçue par l'autre", de quelles modifications parles tu ?


---------------
J'ai un string dans l'array (Paris Hilton)
n°1884687
Vings
Thèse, Antithèse, Charentaises
Posté le 14-05-2009 à 17:04:01  profilanswer
 

Harkonnen a écrit :

Euh... alors déjà, ta dll, elle est développée en quel langage ?
Comment l'appelles tu en C++ ? en C# ?
Quand tu dis "les modifications de l'un des programme sur la dll, n'est pas perçue par l'autre", de quelles modifications parles tu ?


 
désolé de n'avoir pas été clair.
La dll est développée en C++.
L'objectif de la dll: stocker des valeurs modifiées par le prog en c++ pour être lue par le prog en c# et vice versa (je n'ai pas trouvé mieux pour faire transiter des variables).  
 
Donc pour répondre à ta question, la dll sera appelée par les deux programmes (il faudra que je fasse un mutex), donc j'ai fais les appels en c# et en c++. Ces appels là marchent en statiques (dll export/import, pas de pointeurs), mais les deux programmes écrivent/lisent chacun sur une instance de dll, donc ça ne fait pas ce que je veux.
 
Peut être que l'appel en statique est incompatible avec ce que je veux faire c'est pour ça que je refais les appels, en dynamique cette fois (je l'ai fais sur le programme en c++, pas encore fini sur celui c#), mais je ne sais pas si cela vient de là.
 
 
 

n°1884692
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 14-05-2009 à 17:11:21  profilanswer
 

Et les valeurs modifiées par le prog en C++, tu les transmets comment à ta dll ? Par un fichier ?
Sinon, pour faire communiquer tes programmes, pourquoi ne pas passer par une sérialisation XML ? C'est quand même plus pratique qu'une dll non ?


---------------
J'ai un string dans l'array (Paris Hilton)
n°1884693
Vings
Thèse, Antithèse, Charentaises
Posté le 14-05-2009 à 17:23:38  profilanswer
 

Harkonnen a écrit :

Et les valeurs modifiées par le prog en C++, tu les transmets comment à ta dll ? Par un fichier ?
Sinon, pour faire communiquer tes programmes, pourquoi ne pas passer par une sérialisation XML ? C'est quand même plus pratique qu'une dll non ?


 
Les valeurs modifiées par le prog en C++ sont transmises par une fonction de la dll.  
Typiquement: le programme en c++ appel setTemperature de la dll qui modifie la variable temperature de la dll.  
Le programme en c# lis ensuite cette variable.
Il n'y a pas d'autre intermédiaire.
J'ai choisi cette approche car elle me semblais plus rapide (le programme en c# est une interface graphique, qui devra interagir rapidement avec le programme en c++).
 
Etant assez inexperimenté, je n'ai pas songé à la méthode que tu me décris.

n°1884694
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 14-05-2009 à 17:41:01  profilanswer
 

Vings a écrit :

 

Les valeurs modifiées par le prog en C++ sont transmises par une fonction de la dll.


J'imagine que tu dois écrire un truc dans ce genre :

Code :
  1. int maVariableATransmettre = 3;
  2. MaFonctionDll(maVariableATransmettre);


Si c'est le cas, alors c'est normal, car tu transmets une copie de ta variable, et pas ta variable elle même.
La solution aurait été de transmettre un pointeur vers ta variable à la dll, lequel pointeur sera transmis au programme C#, mais ça ne fonctionnera pas non plus, car l'espace mémoire qui contient ta variable est propre à ton processus C++, et il ne peut pas être écrit par un autre processus (celui en C# en l'occurence).
Donc oublie l'idée de communiquer par dll, c'est très complexe à mettre en oeuvre. La sérialisation consiste, en simplifiant, à transformer un objet en fichier. Ce fichier pourra ensuite être désérialisé par n'importe quel programme qui pourra le modifier et le sérialiser à nouveau.


Message édité par Harkonnen le 14-05-2009 à 18:29:55

---------------
J'ai un string dans l'array (Paris Hilton)
n°1884853
Vings
Thèse, Antithèse, Charentaises
Posté le 15-05-2009 à 10:01:51  profilanswer
 

Ok merci pour le tuyau!

n°1884900
Vings
Thèse, Antithèse, Charentaises
Posté le 15-05-2009 à 11:11:58  profilanswer
 

Je suis en train de me documenter sur la serialisation. J'ai déjà quelques interrogations mais j'attends de les avoir toutes rassemblé pour t'en faire part.
Par ailleurs, je suis tombé sur ce site, décrivant la technique de la mémoire partagée
http://www.developpez.net/forums/d [...] -partagee/  
Je me demande si ça ne résout pas mon problème initial ou si ça n'est pas finalement l'erreur que tu m'a décrit plus haut.


Message édité par Vings le 15-05-2009 à 11:13:28
n°1884948
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 15-05-2009 à 13:36:03  profilanswer
 

Ton problème initial se résout par tout un tas de méthodes pas forcément simples à mettre en oeuvre quand on a pas d'expérience, et qui font appel à des fonctions de gestion de mémoire très proches de l'OS et pas du tout portables car OS-dependantes. La solution la plus simple reste de passer par un fichier externe via un mécanisme de sérialisation.


---------------
J'ai un string dans l'array (Paris Hilton)
mood
Publicité
Posté le 15-05-2009 à 13:36:03  profilanswer
 

n°1886454
Vings
Thèse, Antithèse, Charentaises
Posté le 20-05-2009 à 11:57:09  profilanswer
 

J'ai résolu le problème en suivant les indications de ce site:
http://www.codeproject.com/KB/DLL/ [...] h_DLL.aspx


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] Faire une seule instance de dll pour deux programmes

 

Sujets relatifs
[C] Probléme de récupération des données à travers ttyS (LINUX)[Menu déroulant / Javascript/ C# ]
[C] Matrice de structures : probleme de remplissageProgrammer en C help SVP microchip PIC18F
Mélange port série, C++ et boost::asio[Newbie] utilisation de fscanf et retour fonction
S'autoformer à C, C++, ou java etc., possible? Réaliste?Débutant C++ : compiler sous windows?
[C] Créer un tableau + trier des données avant envoiprobleme de include en melangeant C et C++
Plus de sujets relatifs à : [C#] Faire une seule instance de dll pour deux programmes


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR