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