Appeler une DLL C++/MFC à partir d'un code C#

Appeler une DLL C++/MFC à partir d'un code C# - C#/.NET managed - Programmation

Marsh Posté le 29-04-2006 à 11:51:37    

Question de novice. Pas taper si la question vous paraît idiote.
 
J'ai besoin de savoir si c# permet l'utilisation de code C++ (non managé) inclus dans des DLL. Si oui comment fait-on ?
 
Merci d'avance.

Message cité 1 fois
Message édité par slash33 le 29-04-2006 à 11:54:49
Reply

Marsh Posté le 29-04-2006 à 11:51:37   

Reply

Marsh Posté le 29-04-2006 à 12:51:38    

slash33 a écrit :

Question de novice. Pas taper si la question vous paraît idiote.
 
J'ai besoin de savoir si c# permet l'utilisation de code C++ (non managé) inclus dans des DLL. Si oui comment fait-on ?
 
Merci d'avance.


oui, cf mon plugin dans ma signature [:god]
le plugin est en fait constitué de 2 fichiers : gen_hfr.dll, qui est une dll en C++ managé, dont le rôle est d'utiliser des classes présentes dans un autre fichier : Plugin.dll, en C# et placé dans le GAC
voici le code :

Code :
  1. #include "stdafx.h"
  2. #include "../winamp/gen.h"
  3. #include "../winamp/wa_ipc.h"
  4.  
  5. #using <system.dll>
  6. #using <mscorlib.dll>
  7. #using <System.Windows.Forms.dll>
  8.  
  9. using namespace System::Threading;
  10. using namespace System::Windows::Forms;
  11.  
  12. #undef MessageBox
  13.  
  14.  
  15. // déclarations des fonctions globales Winamp
  16. void config(void);
  17. void quit(void);
  18. int init(void);
  19.  
  20. __value struct Globals
  21. {
  22.     static Plugin::MainApp *thePlugin = NULL;
  23.     static Plugin::FrmProfile *theGUI = NULL;
  24. };
  25.  
  26. winampGeneralPurposePlugin plugin = {
  27.     GPPHDR_VER, //
  28.         "HFR signature update v1.21 (gen_hfr.dll)",
  29.         init,
  30.         config,
  31.         quit
  32. };
  33.  
  34. void config(void)
  35. {
  36.     Globals::theGUI = new Plugin::FrmProfile(Globals::thePlugin);
  37.     Globals::theGUI->ShowDialog();
  38.     Globals::theGUI = NULL;
  39. }
  40.  
  41. void quit(void)
  42. {
  43.     Globals::thePlugin->Quit();
  44.     Globals::thePlugin = NULL;
  45. }
  46.  
  47. int init(void)
  48. {
  49.     Globals::thePlugin = new Plugin::MainApp(plugin.hwndParent);
  50.     return 0;
  51. }
  52.  
  53.  
  54. extern "C" {
  55.     __declspec(dllexport) winampGeneralPurposePlugin *winampGetGeneralPurposePlugin(void)
  56.     {
  57.         return &plugin;
  58.     }
  59. }

c'est tout con hein ? [:god]


Message édité par Harkonnen le 29-04-2006 à 12:52:16

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 29-04-2006 à 12:58:43    

ah merde, j'ai lu la question à l'envers [:petrus75]
pour appeler une dll à partir de C#, faut faire du P/Invoke, ie il faut déclarer la fonction que tu veux utiliser, en marshallant (convertissant) les types natifs en types .NET, ce qui peut se réveler rapidement un casse tête sans nom.
 
ex pour utiliser la fonction SendMessage de user32.dll en C#

Code :
  1. [DllImport("user32.dll", EntryPoint = "SendMessageW" )]
  2.         static unsafe extern int SendMessage(
  3.             IntPtr hWnd,
  4.             int msg,
  5.             int wParam,
  6.             int lParam);


si tu tiens à te lancer là dedans, va faire un tour sur ce site, ça aide bien :
http://www.pinvoke.net/


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 29-04-2006 à 13:38:39    

Merci pour les renseignements.
 
Le pourquoi de ma question:
 
Comme tu le sais, je viens d'intégrer une nouvelle société. Elle est confrontée à une problématique sur laquelle je suis succeptible d'agir : doit on amorcer la migration vers .NET des moyens de développement ?
 
Les exigences portent surtout sur la possibilité de réutiliser les composants métiers développés dans la société au cours des années d'exercice précédentes. Il s'agit en fait de DLLs C++/MFC et VB. Les points d'entrée acceptent non pas des types standards mais un objet instance d'une classe spécifique qui gère de manière extensible les paramètres et les valeurs de retour. Cet artifice permet de stabiliser les interfaces des modules métiers.


Message édité par slash33 le 29-04-2006 à 13:46:00
Reply

Marsh Posté le 20-10-2006 à 11:13:30    

Slt,
 
Et qu'en est il de l'instanciation, depuis C#, d'une classe définie dans une DLL C++ ? Est-ce possible ? Ou est-ce une abération ?
Un exemple de code serait le bienvenu ...


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 20-10-2006 à 11:42:26    

Reply

Marsh Posté le 20-10-2006 à 13:25:43    

Merci,
 
Ca a pas l'air simple ....


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 20-10-2006 à 14:04:42    

Bah c'est basé sur le dialogue par evenement, avec quelques subtilité de configuration. Mais globalement je trouve ça plutot propre. Ca permet aussi de se passer d'interface en C et de se refiler que des types de base.


---------------
Töp of the plöp
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed