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