[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.
[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
[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:
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
[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:
assembly: SecurityPermission(SecurityAction.RequestMinimum, UnmanagedCode=true)
Je me demande si il faut la mettre ?
Merci pour votre aide.
aVr