[C#]Utilisation d'une dll c#

Utilisation d'une dll c# [C#] - C#/.NET managed - Programmation

Marsh Posté le 04-04-2007 à 22:09:21    

Bonjour à tous.
 
Je vous expose mon problème.
J'aimerais faire une dll C# et l'utiliser dans un autre programme (pour mon exemple par un autre programme C#).
 
Donc voici la partie dll:
 
Interface

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections;
  4. using System.Text;
  5. namespace Prototype
  6. {
  7.     interface IEnvoiMail
  8.     {
  9.         void lireLog();
  10.         void envoyerMailAvecCorrespondants(ArrayList liste_correspondant, String message);
  11.        // void envoyerMailAvecCriteres(ArrayList liste_criteres, String message);
  12.        // ArrayList selectionnerCorrespondant();
  13.     }
  14. }


 
 
Implémentation

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections;
  4. using System.Text;
  5. namespace Prototype
  6. {
  7.     class EnvoiMail : IEnvoiMail
  8.     {
  9.         public void lireLog()
  10.         {
  11.             Console.WriteLine("Voici le log..." );
  12.         }
  13.         public void envoyerMailAvecCorrespondants(ArrayList liste_correspondant, String message)
  14.         {
  15.             Console.WriteLine("Le mail \"{0}\" a été envoyé à :", message);
  16.             foreach (object c in liste_correspondant)
  17.                 Console.WriteLine("- {0}",c);
  18.         }
  19.     }
  20. }


 
Je crée ensuite la dll à partir de ces deux fichiers. J'obtient un ma dll (lors de la creation il y a eu 2-3 warnings mais aucune erreur).
 
J'utilise ensuite la dll dans un autre programme et je lance la méthode lireLog().
 

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Runtime.InteropServices;
  5. namespace UsePrototype
  6. {
  7.     class Program
  8.     {
  9.         [DllImport("test.dll" )]
  10.         public static extern void lireLog();
  11.         static void Main(string[] args)
  12.         {
  13.             lireLog();
  14.         }
  15.     }
  16. }


 
Il importe bien la dll mais il me met l'erreur suivante (lancée par l'appel à lireLog()):
 

Code :
  1. System.EntryPointNotFoundException was unhandled
  2.   Message="Unable to find an entry point named 'lireLog' in DLL 'test.dll'."
  3.   Source="UsePrototype"
  4.   TypeName=""
  5.   StackTrace:
  6.        at UsePrototype.Program.lireLog()
  7.        at UsePrototype.Program.Main(String[] args) in C:\****\Program.cs:line 15
  8.        at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
  9.        at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
  10.        at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
  11.        at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
  12.        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
  13.        at System.Threading.ThreadHelper.ThreadStart()


 
Je suis novice en C# (et en manipulation de dll) donc j'aimerais un pti coup de main.
 
ps: j'aimerais aussi tester cette dll avec java. Apparement il faut utiliser jni. Mais le prob c'est que (d'après mes recherches) il faut générer le .h d'après le prog java puis faire le dll en fonction du nom des methodes du .h. Moi ce que je veux c'est qu'un programme java utilise ma dll sans avoir à la redéfinir (il se demerde comme il veut mais il doit s'adapter à la semantique de ma dll). Vous savez comment faire ca?

Reply

Marsh Posté le 04-04-2007 à 22:09:21   

Reply

Marsh Posté le 05-04-2007 à 12:49:51    

euh ben deja ca ne se fait pas du tout comme ca...
 
 [DllImport("test.dll" )] <- c'est pour des vieux machins ca, genre des objets com [:spamafote]
 
Toi tu dois ajouter une "référence" à ta DLL dans ton csproj.
 
Achete toi un bouquin, je crois que ca ira plus vite, parce que la il n'y a meme pas les bases pour expliquer quoi que ce soit [:spamafote]

Reply

Marsh Posté le 05-04-2007 à 13:31:48    

Même si ca fonctionnait comme ça, il n'y a aucune référence à ta classe EnvoiMail dans ton dllimport; comment veux tu pointer vers la méthode correcte ?


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

Marsh Posté le 05-04-2007 à 16:02:28    

Merci à vous deux pour vos réponses.
 
Tout d'abord c'est vrai que je n'ai pas les bases en C# (et donc je sais pas comment utiliser une dll).
Par contre j'ai bien les bases en programmation (notamment objet) et je pense pouvoir comprendre ce que vous pourriez me dire.
 
J'aimerais juste qu'on m'aide à savoir comment on utilise une méthode d'une dll générée. Je veux pas savoir tout sur tout mais juste ca. J'ai recherché sur le net mais je n'y ai trouvé que des informations pas si juste que ca (cf " [DllImport("test.dll" )] " ).
Donc pour m'acheter un bouquin (et accessoirement dépenser 40€) pour juste savoir comment appeller une méthode d'un dll, ca me parait un peu abusé. D'autant que je dois etre au point pour demain soir au plus tard.
 
Donc merci de bien vouloir m'aider à corriger mon code.
 
J'ai rajouté la référence à la dll ds mon projet et viré le DllImport. Le prob c'est qu'il ne reconnait pas IEnvoiMail et lireLog.
 

Code :
  1. static void Main(string[] args)
  2.         {
  3.             object obj;
  4.             obj = new IEnvoiMail();
  5.             obj.lireLog();
  6.         }


Reply

Marsh Posté le 05-04-2007 à 16:03:48    

Tu peux pas instancier une interface [:spamafote]
Et c'est quoi ce object ?


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

Marsh Posté le 05-04-2007 à 16:06:54    

un new sur une interface ?

Reply

Marsh Posté le 05-04-2007 à 16:08:08    

Disons que 40€ pour acheter un bouquin parlant de programmation/conception objet ne serait pas inutile alors.


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

Marsh Posté le 05-04-2007 à 16:27:08    

ben à la limite, même pas. j'ai aucun bouquin sur le C#, je suis une brèe finie, mais voir un new sur une interface ça me fait quand même sauter de ma chaise, tout comme écrire une DLL en .NET puis la réutiliser dans un autre projet me semble particulièrement trivial...
 
msdn, c'est pas fait pour les chiens sans poils.

Reply

Marsh Posté le 05-04-2007 à 16:59:07    

Exact ct pas IEnvoiMail mais EnvoiMail.
Enfin le probleme reste le même, je n'arrive pas à acceder à la classe EnvoiMail même en ayant fait une réference sur la dll.
 
Faire une dll .NET puis la réutiliser est sans doute trivial mais je n'y arrive pas. Si vous pouviez m'aider un ti peu ce serait cool.

Reply

Marsh Posté le 05-04-2007 à 17:11:16    

Crée un projet "Bibliothèque de classes".
=> Ca, c'est ta DLL.
 
Ensuite deux choix : le premier, plus pratique pour le débug et les évolutions : ajoute dans ta solution un nouveau projet "Application Windows". Dans ce nouveau projet, fais "Ajouter références", onglet "projets" et choisi ton projet de ta lib.
 
Autre solution : crée une nouvelle solution, ajouter référence > bouton "parcourir", cherche la sortie (fichier dll) de ton projet de bibliothèque.
 
Et voilà :spamafote:
 
Ensuite, ta lib est accessible dans ton projet comme n'importe quel objet du framework :
 

Code :
  1. using MaLibDll;
  2.  
  3. namespace MonAppli
  4. {
  5.    public class Form1 : Form
  6.    {
  7.        public Form1()
  8.        {
  9.            EnvoiMail em = new EnvoiMail();
  10.        }
  11.    }
  12. }


 
:spamafote:

Reply

Marsh Posté le 05-04-2007 à 17:11:16   

Reply

Marsh Posté le 05-04-2007 à 17:53:36    

Ok j'ai testé les deux et ca marche impec.
Merci beaucoup MagicBuzz!!!
 
Par contre vous savez comment faire en java pour utiliser exactement la même dll (sans utiliser le systeme jni qui redefini la dll)?

Reply

Marsh Posté le 05-04-2007 à 20:15:51    

mon dieu, il te manquait le using :??:


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 17-01-2011 à 16:51:33    

Hum...
 
oui c'est ce que j'allais dire...
 
Essai de mettre "using Prototype;"
Ca devrais mieux fonctionner ;)

Reply

Marsh Posté le 19-01-2011 à 15:34:33    

Ce up  [:tibo2002]

Reply

Sujets relatifs:

Leave a Replay

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