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

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] [Résolu] Comment communiquer avec une dll c++

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C#] [Résolu] Comment communiquer avec une dll c++

n°1514132
akalash47
Posté le 13-02-2007 à 15:36:24  profilanswer
 

Bonjour,
 
Je crée un éditeur de jeu en c# qui doit s'appuyer sur un moteur écrit en c++. Comment est-ce que je peux lier la dll du moteur avec mon projet c#, et communiquer avec?
 
C'est sans doute une question assez courante mais après pas mal de recherches sur le web je ne trouve pas de réponse satisfaisante...
 
Est-ce que vous pourriez me donner des liens vers des tutoriels ou des exemples de code pour cela?
 
Merci d'avance!


Message édité par akalash47 le 19-11-2009 à 23:35:55
mood
Publicité
Posté le 13-02-2007 à 15:36:24  profilanswer
 

n°1514136
_darkalt3_
Proctopathe
Posté le 13-02-2007 à 15:37:56  profilanswer
 

Du côté du marshaling, et aussi sur codeproject, y'a des articles sur le mix de managed c++ et unmanaged c++.


---------------
Töp of the plöp
n°1514138
_darkalt3_
Proctopathe
Posté le 13-02-2007 à 15:42:06  profilanswer
 
n°1514139
_darkalt3_
Proctopathe
Posté le 13-02-2007 à 15:42:31  profilanswer
 
n°1514149
akalash47
Posté le 13-02-2007 à 15:56:13  profilanswer
 

Super. Merci :)

n°1514206
akalash47
Posté le 13-02-2007 à 18:05:17  profilanswer
 

En fait j'ai encore pas mal de questions...
 
Tous les exemples que j'ai pu voir jusqu'à présent appellent des fonctions déclarées static, du genre:
 

Code :
  1. [DllImport ("gdi32.dll",EntryPoint="CreateCompatibleDC" )]
  2. public static extern IntPtr CreateCompatibleDC(IntPtr hdc);


 
Sauf que je cherche à accéder à des classes et à leurs méthodes, qui sont en outre déclarées dans un namespace.
Quelle est la syntaxe pour cela?

n°1514440
akalash47
Posté le 14-02-2007 à 11:30:26  profilanswer
 

C'est possible j'espère! Non?

n°1514451
_darkalt3_
Proctopathe
Posté le 14-02-2007 à 11:43:00  profilanswer
 
n°1514483
akalash47
Posté le 14-02-2007 à 12:16:08  profilanswer
 

Mouais...Ca va pas être simple  :(

n°1514551
_darkalt3_
Proctopathe
Posté le 14-02-2007 à 14:22:21  profilanswer
 

Si si ... c'est pas très dur à faire, juste un poil à comprendre, et encore.
En t'y penchant sérieusement, en 1h t'as codé un programme d'exemple et t'as tout compris.


---------------
Töp of the plöp
mood
Publicité
Posté le 14-02-2007 à 14:22:21  profilanswer
 

n°1515928
akalash47
Posté le 17-02-2007 à 11:44:21  profilanswer
 

Bon voila ce que j'ai fait:
 
Sous Visual Studio je crée un projet "UnManaged" (VC++) où j'ai la classe suivante:

Code :
  1. class UNMANAGED_API UnManagedEditor : public Application { ... };
  2. struct UNMANAGED_API UnManagedFeedback { ... };


qui hérite de la classe Application provenant de la lib du moteur ("Engine.lib" ).
 
J'ai ensuite un projet "Managed" V(C++) avec la classe:

Code :
  1. public __gc class ManagedEditor
  2.   {
  3.   private:
  4.     UnManagedEditor __nogc*           UMEditor;
  5.     UnManagedFeedback    __nogc*   UMFeedback;
  6.   };
  7. ManagedEditor :: ManagedEditor ( )
  8.   {
  9.   UMFeedback = new UnManagedFeedback ( this );
  10.   UMEditor = new UnManagedEditor ( UMFeedback );
  11.   }
  12. ManagedEditor :: ~ManagedEditor ( )
  13.   {
  14.   delete UMEditor;
  15.   delete UMFeedback;
  16.   }


 
Et enfin le projet C# "Editor" où j'ai les déclaration suivantes:

Code :
  1. static class Program
  2.     {
  3.     [STAThread]
  4.     static void Main ( string[] args )
  5.       {
  6.       Application.EnableVisualStyles ( );
  7.       Application.SetCompatibleTextRenderingDefault ( false );
  8.       try
  9.         {
  10.         Application.Run ( new EditorWindow() );
  11.         }
  12.       catch ( Exception e )
  13.         {
  14.         Debug.Write ( e.Message );
  15.         }
  16.       }
  17.     }
  18.   public partial class EditorWindow : Form
  19.     {
  20.     private ManagedEditor  EditorApplication;
  21.     public EditorWindow ( )
  22.       {
  23.       InitializeComponent ( );
  24.       this.EditorApplication = new ManagedEditor ( );
  25.       }


 
Problème: au lancement du programme, une exception System.IO.FileNotFoundException est lancée dans le try(); et le programme ne passe ni dans le constructeur de la classe EditorWindow ni dans le catch() : je n'ai pas de message dans l'OutputWindow!
En fait rien que la déclaration "private ManagedEditor EditorApplication;" déclenche le lancement de cette exception.
Qu'est-ce qui se passe?


Message édité par akalash47 le 17-02-2007 à 12:13:31
n°1515931
akalash47
Posté le 17-02-2007 à 11:52:54  profilanswer
 

Si ça peut aider, quand la classe UnManagedEditor n'hérite pas d'Application, le programme se lance correctement. Donc ça vient peut-être du constructeur de la classe Application...qui est comme ceci:
 

Code :
  1. class DLL_EXPORT Application
  2.   {
  3.   private :
  4.     HINSTANCE     HInstance;
  5.     bool               IsRunning;
  6.     unsigned long  SystemTime;
  7.     ...
  8.   };
  9. Application :: Application ( ) :
  10.   HInstance       ( GetModuleHandle("Engine.dll" ) ),
  11.   IsRunning       ( true ),
  12.   SystemTime    ( 0 )
  13.   {
  14.   Assert ( HInstance );
  15.   }


 
Non?


Message édité par akalash47 le 17-02-2007 à 12:08:02
n°1519394
akalash47
Posté le 24-02-2007 à 15:16:16  profilanswer
 

up!

n°1942160
akalash47
Posté le 18-11-2009 à 23:32:09  profilanswer
 

[Update: Finalement j'ai réussi à faire marcher le moteur au sein de l'éditeur avec une couche unmanged, une managed, et une en C#, ça marchait bien mais c'était lourd en wrappers en tous genres]
 
Bref, depuis deux ans l'éditeur n'a pas bougé alors que le moteur a profondément changé. Maintenant je m'apprête à refondre tout le code de l'éditeur.
 
Donc j'ai toujours en tête ces questions:
- est-ce qu'il n'y a pas un moyen de directement communiquer entre code en unmanaged C++ (dll ou lib du moteur) et code C# (utile surtout pour la gestion de l'interface)? Je suis vraiment obligé de me taper une couche en managed?
- actuellement, toutes les conversions de types (genre std::string vers String C#) sont faites dans la couche de Managed C++. Est-ce qu'il existe des moyens plus simples pour convertir d'un type à l'autre? Et si j'ai une classe Vector3, Matrix4x4 etc. dans mon moteur, est-ce que je ne peux pas directement l'utiliser en C#?
 
Merci.

n°1942608
akalash47
Posté le 19-11-2009 à 23:35:01  profilanswer
 

Nickel ça va vraiment me simplifier la vie!


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

  [C#] [Résolu] Comment communiquer avec une dll c++

 

Sujets relatifs
[Résolu]A Star ou A *Problème IDIOT de conversion string->float [RESOLU]
[VBA] [résolu] Excel - bug sur macro toute simple[Résolu][VS6] WinXP=>Win2k: "This program cannot be run in DOS Mode"
[RESOLU] interdir le download de fichier[Résolu]Variables globales qui ne se réinitialise pas...
[Résolu] Trouve le bon nom d'un répertoire juste avec le début[Résolu] [Batch] Création d'un dossier à l'ouverture de Windows
[resolu]gros doute par rapport à l'affichage écran d'un code[RESOLU]Taille variante des cellules
Plus de sujets relatifs à : [C#] [Résolu] Comment communiquer avec une dll c++


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