我有两个不同的C#应用程序在同一时间运行。两个不同的进程可以共享相同的DLL数据吗?
我希望他们都能够访问DLL的同一个“实例”(也在C#中)。
该DLL保存一些数据,我想返回到两个应用程序中的任何一个请求它。
我的DLL是线程安全的,所以我希望这是可能的,但我不知道如何。
任何帮助或建议将不胜感激。
我有两个不同的C#应用程序在同一时间运行。两个不同的进程可以共享相同的DLL数据吗?
我希望他们都能够访问DLL的同一个“实例”(也在C#中)。
该DLL保存一些数据,我想返回到两个应用程序中的任何一个请求它。
我的DLL是线程安全的,所以我希望这是可能的,但我不知道如何。
任何帮助或建议将不胜感激。
进程空间将有所不同,例如,DLL中的全局变量将针对每个单独的进程。内存中的代码可能会被共享(Windows通常使用引用计数来提高该部分的效率)。
如果您希望共享在两个进程之间的DLL中访问的信息,那么似乎有必要使用某种IPC(进程间通信)机制,例如套接字,共享内存,管道等
所以你的意思是说,两个加载的DLL将通过命名管道相互通信? – 2010-06-02 17:47:07
@ Jelly Amma:如果你实现它们,他们可以通过管道相互交谈。这不是自动的,如果这是你问的。 – 2010-06-02 17:57:41
DLL没有实例,它在主机进程中加载。在两个应用程序中引用程序集并使用它的类/方法。
如果您想避免为两个应用程序部署相同的程序集,您可以使用put it in the GAC。
这是可能的。您可以在GAC中安装DLL(需要强大的命名组件),以便两个应用程序都可以轻松访问它。
或者将其粘贴到一个文件夹中,并让这两个应用程序都搜索该文件夹的dll。
<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>
我不知道这是否可以在C#但在C做++,您还可以使用共享内存部分,如果共享的信息是不是太复杂了。你只需要使用例如互斥
关于这个问题的好文章来同步访问此的ressource:http://www.codeproject.com/KB/threads/SharedMemory_IPC_Threads.aspx
玩得开心
如果你的DLL创建一个名为MemoryMappedFile(在内存或磁盘上),那么这两个应用程序可以共享该DLL创建的内存。每个应用程序将有一个不同的指向共享内存的指针,但内存实际上将被共享。 您必须为共享内存使用相同的名称,并且您独立于进程之间的线程安全。 (命名的信号量或互斥量将起作用,CriticalSection不会)。
DLL只是简单地放置了线性数据和代码的集合,即不像C#中的“对象”那样结构化。一个DLL如何成为一个实例?如果你的意思是代码和数据共享;这取决于操作系统。 – Pindatjuh 2010-06-02 17:27:28