2010-06-02 5 views
6

Ho due diverse applicazioni C# in esecuzione contemporaneamente.Gli stessi dati DLL possono essere condivisi da 2 processi diversi?

Vorrei che entrambi potessero accedere alla stessa "istanza" di una DLL (anche in C#).

La DLL contiene alcuni dati che vorrei tornare a qualsiasi delle due applicazioni lo richiede.

La mia DLL è thread-safe, quindi speravo fosse possibile, ma non sono sicuro di come.

Qualsiasi aiuto o consiglio sarebbe molto apprezzato.

+2

Una DLL viene semplicemente inserita una raccolta di dati lineari e codice, cioè non strutturati come "oggetti" in C#. Come può una DLL essere un'istanza? Se intendi la condivisione di codice e dati; questo dipende dal sistema operativo. – Pindatjuh

risposta

5

Lo spazio del processo sarà diverso quindi, ad esempio, le variabili globali nella DLL saranno specifiche per ogni processo separato. È possibile che il codice in memoria venga condiviso (in genere Windows utilizza il conteggio dei riferimenti per rendere la parte più efficiente).

Se si desidera condividere le informazioni a cui si accede nella DLL tra i due processi, sembra probabile che sarà necessario utilizzare un tipo di meccanismo IPC (comunicazione tra processi) come socket, memoria condivisa, pipe , ecc.

+0

Quindi vuoi dire che entrambe le DLL caricate parleranno tra loro attraverso, ad esempio, named pipe? –

+0

@Jelly Amma: Potrebbero parlare tra loro attraverso i tubi se li implementate. Non è automatico se è quello che stai chiedendo. –

0

Una DLL non ha istanza, è caricata in un processo host. Fare riferimento all'assieme in entrambe le applicazioni e utilizzare le sue classi/metodi.

Se si desidera evitare di distribuire lo stesso assembly per entrambe le applicazioni, è possibile eseguire put it in the GAC.

0

È possibile. È possibile installare la DLL nel GAC (richiede gruppi con nome sicuro) in modo che entrambe le applicazioni possano accedervi facilmente.

Oppure incollarlo in una cartella e fare in modo che entrambe le app cerchino quella cartella per la DLL.

MSDN support article

<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

Non so se questo può essere fatto in C#, ma in C++ è possibile utilizzare anche le sezioni di memoria condivisa, se le informazioni da condividere, non è troppo complicato. Si potrebbe semplicemente bisogno di sincronizzare l'accesso a questa risorsa utilizzando ad esempio un mutex

Un buon articolo sul tema: http://www.codeproject.com/KB/threads/SharedMemory_IPC_Threads.aspx

Buon divertimento

0

Se la DLL crea un nome file mappato in memoria (in memoria o su disco) quindi le due applicazioni possono condividere la memoria creata dalla DLL. Ogni applicazione avrà un puntatore diverso per la memoria condivisa ma la memoria verrà effettivamente condivisa. È necessario utilizzare lo stesso nome per la memoria condivisa e si è da soli in quanto thread-safe tra i processi. (I semafori o i mutex nominati funzioneranno, CriticalSection non funzionerà.)