2010-06-02 96 views
6

我有两个不同的C#应用​​程序在同一时间运行。两个不同的进程可以共享相同的DLL数据吗?

我希望他们都能够访问DLL的同一个“实例”(也在C#中)。

该DLL保存一些数据,我想返回到两个应用程序中的任何一个请求它。

我的DLL是线程安全的,所以我希望这是可能的,但我不知道如何。

任何帮助或建议将不胜感激。

+2

DLL只是简单地放置了线性数据和代码的集合,即不像C#中的“对象”那样结构化。一个DLL如何成为一个实例?如果你的意思是代码和数据共享;这取决于操作系统。 – Pindatjuh 2010-06-02 17:27:28

回答

5

进程空间将有所不同,例如,DLL中的全局变量将针对每个单独的进程。内存中的代码可能会被共享(Windows通常使用引用计数来提高该部分的效率)。

如果您希望共享在两个进程之间的DLL中访问的信息,那么似乎有必要使用某种IPC(进程间通信)机制,例如套接字,共享内存,管道等

+0

所以你的意思是说,两个加载的DLL将通过命名管道相互通信? – 2010-06-02 17:47:07

+0

@ Jelly Amma:如果你实现它们,他们可以通过管道相互交谈。这不是自动的,如果这是你问的。 – 2010-06-02 17:57:41

0

DLL没有实例,它在主机进程中加载​​。在两个应用程序中引用程序集并使用它的类/方法。

如果您想避免为两个应用程序部署相同的程序集,您可以使用put it in the GAC

0

这是可能的。您可以在GAC中安装DLL(需要强大的命名组件),以便两个应用程序都可以轻松访问它。

或者将其粘贴到一个文件夹中,并让这两个应用程序都搜索该文件夹的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

如果你的DLL创建一个名为MemoryMappedFile(在内存或磁盘上),那么这两个应用程序可以共享该DLL创建的内存。每个应用程序将有一个不同的指向共享内存的指针,但内存实际上将被共享。 您必须为共享内存使用相同的名称,并且您独立于进程之间的线程安全。 (命名的信号量或互斥量将起作用,CriticalSection不会)。

相关问题