none
wcf dll C++ en Natif

    Question

  • Bonjour,

    j'ai une application WCF SILVERLIGHT 5, ASP.NET 4.0, BasicHttpBinding, sous IIS 7 (Windows Server 2008R2) et un SQL Server 2005.

    cette application communique avec une DLL C++/CLI au niveau serveur (Web Service) qui fait des calculs plus une MAJ d'une base de données propriétaire (en fichiers binaire) de la façon suivante (C#):

    [DllImport(@"PilSVA.dll", EntryPoint = "DLP_ECHGSV_CMIO", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
            public static extern IntPtr DLP_ECHGSV_CMIO([MarshalAs(UnmanagedType.U4)] int i, [MarshalAs(UnmanagedType.LPStr)] string s1, [MarshalAs(UnmanagedType.LPStr)] string s2);
    
            [DllImport(@"PilSVA.dll", EntryPoint = "DLP_DIALMIO", ExactSpelling = false)]
            public static extern IntPtr DLP_DIALMIO([MarshalAs(UnmanagedType.LPStr)] string pCodeGroupage, [MarshalAs(UnmanagedType.LPStr)] string pCodeUser, EnTeteCommande pEnteteCommande, [MarshalAs(UnmanagedType.I4)] int pNoLigneImposee, [MarshalAs(UnmanagedType.I4)] int pAvancementCommande, [MarshalAs(UnmanagedType.I4)] int pModeTraitement, [MarshalAs(UnmanagedType.U4)] int i, [MarshalAs(UnmanagedType.LPStr)] string s1, [MarshalAs(UnmanagedType.LPStr)] string s2, [MarshalAs(UnmanagedType.LPStr)] string s3); 

    la première fonction est connect + deconnect avec les informations de l'utilisateur (context utilisateur indispensable).

    la seconde envoie un objet métier EnTeCommande pour calcul puis (à la fin) récupérer cet objet avec des nouvelles données.

    mon problème est le suivant:

    IIS WorkerProcess (w3wp.exe) ne créer qu'une seule instance de la DLL C++/CLI, non pas une instance par utilisateur connecté.

    résultat, quand j'ai deux requêtes de calcul simultanées l'application plante.

    Questions :

    1. y a il un moyen de créer une instance DLL C++ par utilisateur ?
    2. comme je n'arrive à résoudre le première question, je suis partie sur la solution de gestion de ressource partagée avec le code suivant:
    object thisLock = new object();
    bool lockWasTaken = false;
    
    try
    {
         System.Threading.Monitor.Enter(thisLock, ref lockWasTaken);
                    l_retour = DLP_DIALMIO(l_CodeGroupagePlanipe, pUser.Login.ToUpper(), EnTeteCommande, NoLignesImposee, pAvancement, pModeCalcul, 99, Message, BufferDeConnect, BufferEchange);
    }
    finally
    {
         if (lockWasTaken)
         {
              System.Threading.Monitor.Exit(thisLock);
         }
    }

    mais cela ne fonctionne pas, sa plante carrément la liaison avec la DLL C++ mais le reste!!

    Merci pour votre aide, perce que je suis à court d'idée.


    Cordialement

    mardi 9 avril 2013 16:20

Réponses

  • Bonjour,

    la DLL ne peut pas ouvrir d'autre thread (logiquement).

    je garde ma solution (InstanceContextMode = Single et ConcurrencyMode = Single plus le lock sur la ressource)

    Si je trouve autre chose je posterai sur le forum.

    je vous remercie pour votre aide.


    Cordialement

    • Marqué comme réponse IghzerA mercredi 17 avril 2013 17:31
    mercredi 17 avril 2013 17:31

Toutes les réponses