IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[WinService][C#] Comment appeler dll C/C++ ?


Sujet :

Windows Forms

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Points : 3
    Points
    3
    Par défaut [WinService][C#] Comment appeler dll C/C++ ?
    Bonjour,
    J'ai créé un service windows écrit en C# qui fait appel aux fonctions d'une DLL de communication écrite en C/C++ (code non managé) via DllImport.
    L'installation de mon service se passe bien, le service démarre mais quand j'appelle une fonction de la DLL, rien ne se passe.
    Je pensais à un problème de répertoire, j'ai mis la DLL dans le répertoire du service ou dans windows/system32 mais j'ai toujours de même problème.
    J'ai dû oublier de faire quelque chose: ma DLL est du code non managé, faut-il signer la DLL, créer un assembly ? enregistrer la DLL ? dois-je enregistrer ma DLL dans la base de registre ? je suis perdu avec toutes ces notions.
    Est-ce que quelqu'un peut m'aider ?
    Merci d'avance,
    aVr

    PS: J'ai créé un executable en C# (commande dos) pour tester la DLL et elle fonctionne parfaitement.

  2. #2
    Membre expérimenté
    Avatar de freddyboy
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2003
    Messages
    810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2003
    Messages : 810
    Points : 1 696
    Points
    1 696
    Par défaut
    tu as juste besoin d'avoir la dll dans le repertoire de ton service.
    Ensuite regarde le tuto : http://morpheus.developpez.com/dlldotnet/

    @+
    Someday I will be the most powerful Jedi !

    Freddyboy - Blog

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Points : 3
    Points
    3
    Par défaut [WS][C#] Appeler une DLL 'non managed' dans un service windo
    Bonjour,
    Merci pour la réponse mais malhureusement, c n'est pas aussi simple que cela: j'appele depuis un service windows (écrit en c#) les fonctions d'une DLL (écrite en C/C++) 'non managed' via la méthode DllImport.
    Quand le service Windows appele les fonctions de la DLL, il ne se passe rien (j'ai l'impression qu'il ne les voit pas).
    J'ai essayé de creer une DLL .net qui fait l'interface entre le service windows et la DLL 'non managed' (je peux ainsi la signer, enregistrer l'assembly dans le GAC) mais j'ai le même résultat.
    Je m'oriente maintenant vers des problèmes de droit/permission : est-ce que je peux appeler du code non géré dans un service windows?
    Cordialement,
    aVr

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    1)-Peut tu verifier, si les fonctions de ta dll on besoin de ressources graphiques (par ex : une boite de dialogue qui s'affiche en cas d'exception). Si oui le probleme peut provenir de la.

    2)-Peut tu poster la declaration de ta fonction c++ non managé qui se trouve dans le .h et la declaration qui suit la clause dllimport dans ton projet c#.

    Perso g pas eu de probleme pour appeler du code non managé a partir d'un service c#

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Points : 3
    Points
    3
    Par défaut [WS][C#] Appel à du code non géré depuis un service windows
    Bonjour,

    point 1: mes fonctions de ma DLL n'ont pas besoin de ressource graphique.
    point 2: voici donc la déclaration de mes fonctions dans ma DLL C++/C (code non géré) dans le fichier .h:

    // Fichiers d'en-tête Windows*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include <windows.h>
     
    #define DllExport   extern "C" __declspec(dllexport) void __stdcall 
    #define DllExportInt   extern "C" __declspec(dllexport) int __stdcall 
     
    /* Fonctions à exporter */
    DllExport fct_emission_telegramme(char * str_data, int ilg_data, char * str_rep, int ilg_rep, char * str_nomFichier);
    DllExport fct_1();
    DllExport  fct_2();
     
    Et voici la déclaration de ces fonctions dans le service c#:
    ...
    public class ServiceFct : System.ServiceProcess.ServiceBase
    {
    ...
    #region MesFonctions
    	[DllImport("maDLL.dll"), SuppressUnmanagedCodeSecurity]
    	private unsafe static extern void fct_1();
    	[DllImport("maDLL.dll"), SuppressUnmanagedCodeSecurity]
    	private unsafe static extern void fct_2();
    	[DllImport("maDLL.dll"), SuppressUnmanagedCodeSecurity]
    	private unsafe static extern void fct_emission_telegramme([MarshalAs(UnmanagedType.LPWStr)]
    		string str_data,
    		int ilg_data,
    		[MarshalAs(UnmanagedType.LPWStr)]
    		string str_rep,
    		int ilg_rep,
    		[MarshalAs(UnmanagedType.LPWStr)]
    		string sNomFichier);
    #endregion
    ...
    }

    J'ai essayé aussi sans l'attribut et j'ai toujours le même problème.
    Cordialement,
    aVr

  6. #6
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Points : 3
    Points
    3
    Par défaut [WS][C#] Appel à du code non géré depuis un service windows
    Bonjour,
    Ca marche maintenant: j'ai corrigé un problème de répertoire dans ma DLL non géré. J'utilisais un chemin relatif style ..\patin\couffin par rapport à l'emplacement de l'exe du service windows or le getCurrntDirectory du service windows retourne windows\system32 et je ne retrouvais pas mes fichiers de config (mea culpa).
    Par contre, je me pose des questions:
    - Est-ce que l'attribut de sécurité SuppressUnmanagedCodeSecurity est necessaire ?
    - J'ai signé l'exe du service Windows avec sn -k, faut-il le faire?
    - J'ai rajouté dans le fichier AssemblyInfo.cs du service Windows la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assembly: SecurityPermission(SecurityAction.RequestMinimum, UnmanagedCode=true)
    Je me demande si il faut la mettre ?
    Merci pour votre aide.
    aVr

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment appeler une dll VB6 sous delphi
    Par zanoubya dans le forum Débuter
    Réponses: 6
    Dernier message: 05/10/2009, 18h04
  2. Réponses: 2
    Dernier message: 31/08/2005, 16h12
  3. Réponses: 16
    Dernier message: 22/03/2005, 21h57
  4. Comment appeler des API windows en C ?
    Par JuanLopez1966 dans le forum Windows
    Réponses: 6
    Dernier message: 22/12/2004, 10h34
  5. PRocédure stocké, comment appeler avec delphi?
    Par SkyDev dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/04/2004, 18h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo