Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Web Service / unmanaged DLL - OK 2 fois sur 3

5 réponses
Avatar
Delf
Bonjour.

J'ai un Web Service qui utilise un jeu de DLL (plugins - C++ non
managé). Ces DLL implémentent une même interface.

J'arrive à invoquer les méthodes des 2 premières DLL sans problème, où
que soient les DLL.

Par contre, quand j'utilise la 3° DLL, lors de l'invocation d'une
méthodes, la page se charge indéfiniment... pas de time-out apparemment.

Ces 3 DLL sont chargées via une DLL faite, elle, en C#. Cette dernière
propose les mêmes méthodes pour chacune des DLL. Pourquoi celà
marche-t-il avec 2 des 3 DLL ? Aucune idée... Le schéma d'invaction est
pourtant le même pour chacune des DLL. Les DLL exposent les mêmes
méthodes sous les même signatures.

Je n'arrive pas à accéder à cette troisième DLL. Impossible d'y rentrer
avec le debugger (debuggage de code non managé à 'True' et j'ai bien mis
les dépendances... fonctionne avec les autres DLL - je dispose des
sources, le timestamp du pdb correspond à la DLL associée).

Voici un fragment du code de la DLL/C# :

m_dllToUseForMDM = LoadConfig.Instance.MDMLibraryPATH;

AssemblyName asmName = new AssemblyName();

asmName.Name = "mdmAssembly";
AssemblyBuilder dynamicAsm =
AppDomain.CurrentDomain.DefineDynamicAssembly
(asmName, AssemblyBuilderAccess.Run);
m_dllMethodList = dynamicAsm.DefineDynamicModule("mdmModule");

MethodBuilder AddMethod = null;

...

AddMethod = m_dllMethodList.DefinePInvokeMethod
(
"mdmSetUser",
m_dllToUseForMDM,
MethodAttributes.Static | MethodAttributes.Public |
MethodAttributes.PinvokeImpl,
CallingConventions.Standard,
typeof(int),
new Type[]{ typeof(string), typeof(string), typeof(string) },
CallingConvention.Winapi,
CharSet.Ansi
);
AddMethod.SetImplementationFlags(MethodImplAttributes.PreserveSig |
AddMethod.GetMethodImplementationFlags());
m_dllMethodList.CreateGlobalFunctions();

...

public int mdmSetUser(string pLogin, string pPassword, string pAccount)
{
MethodInfo method = m_dllMethodList.GetMethod("mdmSetUser");
return (int)method.Invoke
(null, new Object[]{ pLogin, pPassword, pAccount });
}

Le blocage se fait sur le return.

Le WS dispose d'une WebMethod SetUser() qui appelle tout simplement
mdmSetUser()

Les différences entre les DLL (elles font exactement les mêmes choses) :

- la première utilise une application externe : Manreo Warehouse,
- la seconde utilise le système local : disque dur,
- la troisième utilise ADO/MySQL.

Voilà, si qq'un peut m'aider, ça serait sympa. 3 jours que je bloque !
Merci anticipé.

--
Delf

5 réponses

Avatar
Delf
Delf wrote:

[..]



Oubli : Celà marche dans une WinForm.

--
Delf
Avatar
Delf
Delf wrote:

[..]



J'ai trouvé ce thread et apparemment, je suis dans le même cas :

http://groups.google.fr/group/microsoft.public.dotnet.framework.aspnet.webservices/browse_frm/thread/b3e2f29131e81110/1cecfb441f61abb0?q=unmanaged++%22web+service%22&rnum4&hl=fr#1cecfb441f61abb0

Mais pas d'indication pertinante...

--
Delf
Avatar
Delf
Delf wrote:

[...]



Dans le Log Event Application :

wuaueng.dll (2856) SUS20ClientDataStore: Le moteur de base de données a
démarré une nouvelle instance (0).
wuauclt (2856) Le moteur de base de données 5.01.2600.2180 est démarré.
wuauclt (440) Le moteur de base de données est arrêté.
wuaueng.dll (440) SUS20ClientDataStore: Le moteur de base de données a
arrêté une instance (0).

--
Delf
Avatar
Simon Mourier
La 3eme DLL doit faire quelque chose de spécial qui ne tourne pas dans un
Web Service. Surtout si l'ensemble fonctionne en Winform.

Rien ne garantit à priori qu'un code écrit pour fonctionner dans un contexte
de type desktop (Winform) va fonctionner sans problème dans un service. Cela
peut-être dû à des problèmes de droits (accès à des fichiers), ou d'accès au
registre (par exemple la clé USER n'est pas forcément chargée en fonction de
l'identité sous laquelle fonctionne le service), mais pas uniquement (pas
d'environnement graphique, ...)

Simon.
www.softfluent.com


"Delf" a écrit dans le message de news:
427f66dc$0$312$
Bonjour.

J'ai un Web Service qui utilise un jeu de DLL (plugins - C++ non managé).
Ces DLL implémentent une même interface.

J'arrive à invoquer les méthodes des 2 premières DLL sans problème, où que
soient les DLL.

Par contre, quand j'utilise la 3° DLL, lors de l'invocation d'une
méthodes, la page se charge indéfiniment... pas de time-out apparemment.

Ces 3 DLL sont chargées via une DLL faite, elle, en C#. Cette dernière
propose les mêmes méthodes pour chacune des DLL. Pourquoi celà marche-t-il
avec 2 des 3 DLL ? Aucune idée... Le schéma d'invaction est pourtant le
même pour chacune des DLL. Les DLL exposent les mêmes méthodes sous les
même signatures.

Je n'arrive pas à accéder à cette troisième DLL. Impossible d'y rentrer
avec le debugger (debuggage de code non managé à 'True' et j'ai bien mis
les dépendances... fonctionne avec les autres DLL - je dispose des
sources, le timestamp du pdb correspond à la DLL associée).

Voici un fragment du code de la DLL/C# :

m_dllToUseForMDM = LoadConfig.Instance.MDMLibraryPATH;

AssemblyName asmName = new AssemblyName();

asmName.Name = "mdmAssembly";
AssemblyBuilder dynamicAsm > AppDomain.CurrentDomain.DefineDynamicAssembly
(asmName, AssemblyBuilderAccess.Run);
m_dllMethodList = dynamicAsm.DefineDynamicModule("mdmModule");

MethodBuilder AddMethod = null;

...

AddMethod = m_dllMethodList.DefinePInvokeMethod
(
"mdmSetUser",
m_dllToUseForMDM,
MethodAttributes.Static | MethodAttributes.Public |
MethodAttributes.PinvokeImpl,
CallingConventions.Standard,
typeof(int),
new Type[]{ typeof(string), typeof(string), typeof(string) },
CallingConvention.Winapi,
CharSet.Ansi
);
AddMethod.SetImplementationFlags(MethodImplAttributes.PreserveSig |
AddMethod.GetMethodImplementationFlags());
m_dllMethodList.CreateGlobalFunctions();

...

public int mdmSetUser(string pLogin, string pPassword, string pAccount)
{
MethodInfo method = m_dllMethodList.GetMethod("mdmSetUser");
return (int)method.Invoke
(null, new Object[]{ pLogin, pPassword, pAccount });
}

Le blocage se fait sur le return.

Le WS dispose d'une WebMethod SetUser() qui appelle tout simplement
mdmSetUser()

Les différences entre les DLL (elles font exactement les mêmes choses) :

- la première utilise une application externe : Manreo Warehouse,
- la seconde utilise le système local : disque dur,
- la troisième utilise ADO/MySQL.

Voilà, si qq'un peut m'aider, ça serait sympa. 3 jours que je bloque !
Merci anticipé.

--
Delf


Avatar
Delf
Simon Mourier wrote:

La 3eme DLL doit faire quelque chose de spécial qui ne tourne pas dans un
Web Service. Surtout si l'ensemble fonctionne en Winform.

Rien ne garantit à priori qu'un code écrit pour fonctionner dans un contexte
de type desktop (Winform) va fonctionner sans problème dans un service. Cela
peut-être dû à des problèmes de droits (accès à des fichiers), ou d'accès au
registre (par exemple la clé USER n'est pas forcément chargée en fonction de
l'identité sous laquelle fonctionne le service), mais pas uniquement (pas
d'environnement graphique, ...)



Finalement, c'était du à ADO...

--
Delf