7

我有两个不同的 C# 应用程序同时运行。

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

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

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

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

4

5 回答 5

5

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

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

于 2010-06-02T17:28:45.313 回答
0

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

如果您想避免为两个应用程序部署相同的程序集,您可以将它放在 GAC 中

于 2010-06-02T17:27:32.677 回答
0

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

或者将其粘贴在一个文件夹中,让两个应用程序都在该文件夹中搜索 dll。

MSDN 支持文章

<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>
于 2010-06-02T17:29:34.830 回答
0

我不知道这是否可以在 C# 中完成,但在 C++ 中,如果要共享的信息不太复杂,您也可以使用共享内存部分。您只需要使用例如互斥锁来同步对此资源的访问

关于这个主题的一篇好文章:http: //www.codeproject.com/KB/threads/SharedMemory_IPC_Threads.aspx

玩得开心

于 2010-06-03T02:50:27.103 回答
0

如果您的 DLL 创建了一个命名的 MemoryMappedFile(在内存中或磁盘上),那么这两个应用程序可以共享由 DLL 创建的内存。每个应用程序都有一个不同的指向共享内存的指针,但内存实际上是共享的。您必须为共享内存使用相同的名称,并且您自己就可以在进程之间保持线程安全。(命名信号量或互斥量可以工作,CriticalSection 不行。)

于 2016-10-20T21:24:25.823 回答