7
votes

Les mêmes données DLL peuvent-elles être partagées par 2 processus différents?

J'ai deux applications C # différentes qui fonctionnent en même temps.

Je voudrais que les deux d'être capables d'accéder à la même "instance" d'une DLL (également en C #).

La DLL détient des données que j'aimerais revenir à la quotée des deux applications le demandent.

Ma DLL est thread-coffre-fort, alors j'espérais que cela serait possible mais je ne sais pas comment.

Toute aide ou conseil serait très appréciée.


1 commentaires

Une DLL est simplement mettre une collection de données linéaires et de code, c'est-à-dire non structuré comme des "objets" en C #. Comment une DLL peut-elle être une instance? Si vous voulez dire code et partage de données; Ceci est dépendant du système d'exploitation.


5 Réponses :


0
votes

Une DLL n'a aucune instance, elle est chargée dans un processus hôte. Référencez l'assemblage dans les deux applications et utilisez ses classes / méthodes.

Si vous souhaitez éviter de déployer le même assemblage pour les deux applications, vous pouvez Mettez-le dans le GAC .


0 commentaires

5
votes

L'espace de processus sera différent, par exemple, les variables globales de la DLL seront spécifiques à chaque processus distinct. Il est possible que le code en mémoire soit partagé (Windows utilise généralement le comptage de référence pour rendre cette pièce plus efficace).

Si vous souhaitez partager des informations accédées dans la DLL entre les deux processus, il semble probable qu'il soit nécessaire d'utiliser une sorte de mécanisme IPC (communication interprocessé) tel que les prises, la mémoire partagée, les tuyaux, c.


2 commentaires

Vous voulez donc dire que les deux dll chargées se parleront à travers, disons, nommés tuyaux?


@Jelly AMMA: Ils pourraient se parler dans des tuyaux si vous le mettez en œuvre. Ce n'est pas automatique si c'est ce que vous demandez.



0
votes

C'est possible. Vous pouvez installer la DLL dans le GAC (nécessite de solides assemblys nommés) afin que les deux applications aient un accès facile à celui-ci.

ou le coller dans un dossier et que les deux applications recherchent ce dossier pour la DLL. P>

Article d'assistance MSDN P>

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="MyAssembly2"  culture="neutral" publicKeyToken="307041694a995978"/>
            <codeBase version="1.0.1524.23149" href="FILE://C:/Myassemblies/MyAssembly2.dll"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>


0 commentaires

0
votes

Je ne sais pas si cela peut être fait en C # mais en C ++, vous pouvez également utiliser des sections de mémoire partagées si l'info à partager n'est pas trop compliquée. Vous auriez simplement besoin de synchroniser l'accès à cette ressource en utilisant par exemple un mutex

Un bon article sur le sujet: http://www.codeproject.com/ KB / threads / SharedMemory_ipc_threads.aspx

amusez-vous


0 commentaires

0
votes

Si votre DLL crée une mémoire incorporée nommée (en mémoire ou sur disque), les deux applications peuvent partager la mémoire créée par la DLL. Chaque application aura un pointeur différent de la mémoire partagée, mais la mémoire sera réellement partagée. Vous devez utiliser le même nom pour la mémoire partagée et vous êtes sur votre propre enfance en toute sécurité entre les processus. (Nommés sémaphores ou mutiles fonctionnera, la critique ne le fera pas.)


0 commentaires