我有两个不同的 C# 应用程序同时运行。
我希望他们都能够访问 DLL 的相同“实例”(也在 C# 中)。
DLL 包含一些我想返回到两个应用程序中的任何一个请求它的数据。
我的 DLL 是线程安全的,所以我希望这是可能的,但我不确定如何。
任何帮助或建议将不胜感激。
进程空间会有所不同,例如,DLL 中的全局变量将特定于每个单独的进程。内存中的代码可能会被共享(Windows 通常使用引用计数来提高该部分的效率)。
如果您想在两个进程之间共享在 DLL 中访问的信息,那么似乎有必要使用某种 IPC(进程间通信)机制,例如套接字、共享内存、管道等。
DLL 没有实例,它是在宿主进程中加载的。在两个应用程序中引用程序集并使用它的类/方法。
如果您想避免为两个应用程序部署相同的程序集,您可以将它放在 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++ 中,如果要共享的信息不太复杂,您也可以使用共享内存部分。您只需要使用例如互斥锁来同步对此资源的访问
关于这个主题的一篇好文章:http: //www.codeproject.com/KB/threads/SharedMemory_IPC_Threads.aspx
玩得开心
如果您的 DLL 创建了一个命名的 MemoryMappedFile(在内存中或磁盘上),那么这两个应用程序可以共享由 DLL 创建的内存。每个应用程序都有一个不同的指向共享内存的指针,但内存实际上是共享的。您必须为共享内存使用相同的名称,并且您自己就可以在进程之间保持线程安全。(命名信号量或互斥量可以工作,CriticalSection 不行。)