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

Comment communiquer avec une dll c++ [C#] [Résolu] - C#/.NET managed - Programmation

Marsh Posté le 13-02-2007 à 15:36:24    

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
Reply

Marsh Posté le 13-02-2007 à 15:36:24   

Reply

Marsh Posté le 13-02-2007 à 15:37:56    

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
Reply

Marsh Posté le 13-02-2007 à 15:42:06    

Reply

Marsh Posté le 13-02-2007 à 15:42:31    

Reply

Marsh Posté le 13-02-2007 à 15:56:13    

Super. Merci :)

Reply

Marsh Posté le 13-02-2007 à 18:05:17    

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?

Reply

Marsh Posté le 14-02-2007 à 11:30:26    

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

Reply

Marsh Posté le 14-02-2007 à 11:43:00    

Reply

Marsh Posté le 14-02-2007 à 12:16:08    

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

Reply

Marsh Posté le 14-02-2007 à 14:22:21    

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
Reply

Marsh Posté le 14-02-2007 à 14:22:21   

Reply

Marsh Posté le 17-02-2007 à 11:44:21    

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
Reply

Marsh Posté le 17-02-2007 à 11:52:54    

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
Reply

Marsh Posté le 24-02-2007 à 15:16:16    

up!

Reply

Marsh Posté le 18-11-2009 à 23:32:09    

[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.

Reply

Marsh Posté le 19-11-2009 à 23:35:01    

Nickel ça va vraiment me simplifier la vie!

Reply

Sujets relatifs:

Leave a Replay

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