2010-06-02 18 views
6

Tengo dos aplicaciones diferentes de C# que se ejecutan al mismo tiempo.¿Se pueden compartir los mismos datos DLL con 2 procesos diferentes?

Me gustaría que ambos puedan acceder a la misma "instancia" de una DLL (también en C#).

La DLL contiene algunos datos que me gustaría devolver a cualquiera de las dos aplicaciones que lo soliciten.

Mi DLL es segura para subprocesos, así que esperaba que esto fuera posible, pero no estoy seguro de cómo.

Cualquier ayuda o consejo sería muy apreciado.

+2

Un archivo DLL simplemente pone una colección de datos lineales y el código, es decir, no estructurado como "objetos" están en C#. ¿Cómo puede una DLL ser una instancia? Si te refieres al intercambio de código y datos; esto depende del sistema operativo. – Pindatjuh

Respuesta

5

El espacio de proceso será diferente así que, por ejemplo, las variables globales en la DLL serán específicas para cada proceso por separado. Es posible que el código en la memoria se comparta (Windows normalmente utiliza el recuento de referencias para hacer que esa parte sea más eficiente).

Si desea compartir información a la que se accede en la DLL entre los dos procesos, entonces es probable que sea necesario utilizar algún tipo de mecanismo IPC (comunicación entre procesos) como sockets, memoria compartida, tuberías , etc.

+0

¿Quiere decir que ambos archivos DLL cargados hablarán entre sí a través de, por ejemplo, canalizaciones con nombre? –

+0

@Jelly Amma: Podrían hablar entre sí a través de tuberías si lo implementa. No es automático si eso es lo que estás preguntando. –

0

Una DLL no tiene instancia, se carga en un proceso de host. Haga referencia al ensamblaje en ambas aplicaciones y use sus clases/métodos.

Si desea evitar la implementación del mismo conjunto para ambas aplicaciones, puede put it in the GAC.

0

Es posible. Puede instalar el archivo DLL en el GAC (requiere conjuntos nombrados fuertes) para que ambas aplicaciones tengan fácil acceso a él.

O pégalo en una carpeta y haz que ambas aplicaciones busquen esa carpeta para el 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

No sé si esto se puede hacer en C#, pero en C++ también puede utilizar las secciones de memoria compartida si la información que compartir no es demasiado complicado. Usted simplemente necesita para sincronizar el acceso a este ressource usando por ejemplo un mutex

Un buen artículo sobre el tema: http://www.codeproject.com/KB/threads/SharedMemory_IPC_Threads.aspx

Diviértete

0

Si su DLL crea un archivo proyectado en memoria llamado (en la memoria o en el disco) entonces las dos aplicaciones pueden compartir la memoria creada por el DLL. Cada aplicación tendrá un puntero diferente a la memoria compartida pero la memoria realmente se compartirá. Tienes que usar el mismo nombre para la memoria compartida y estás solo ya que es seguro para hilos entre procesos. (Los semáforos o mutexes nombrados funcionarán, CriticalSection no).

Cuestiones relacionadas