C#将DLL限制为仅一个实例

时间:2015-06-26 12:29:34

标签: c# .net dll

我本质上想为应用程序创建一个api,但我只希望一次运行该dll的一个实例。

因此,多个应用程序也需要能够同时使用DLL。正如您对普通api所期望的那样。

但是我希望它是不同应用程序使用的dll的同一个实例。这是因为与硬件的通信我不想重叠。

5 个答案:

答案 0 :(得分:3)

每个进程通常 加载一次,因此如果保证您的应用程序只在单实例模式下运行,那么您无需做任何其他事情。您的单个应用程序实例将只有一个加载的DLL。

现在,如果您想跨应用程序“共享”DLL的“单个实例”,您将不可避免地需要求助于客户端 - 服务器架构。您的DLL必须包装在Windows服务中,这将公开HTTP(或WCF)API。

答案 1 :(得分:2)

你无法按照自己的意愿去做。执行此操作的最佳方法是使用单个进程(DLL不是进程)接收和处理消息,并让您的多个客户端使用仅向此进程发送消息的API(这将是您的DLL)。 / p>

这两个进程的相互通信(您的单个进程和通过API发送或接收消息的客户端)可以通过多种方式完成,选择最适合您的方式(基本上,任何类型的客户端/服务器架构,即使客户端和服务器在同一硬件上运行)

答案 2 :(得分:1)

这是XY-Problem类型的问题。您的实际要求是序列化与底层硬件的交互,因此它们不会重叠。也许这是你应该明确而具体地询问的内容。

您的提议的解决方案是拥有一个类似于OS- wide 单例的DLL或类似的东西。这实际上就是你要问的;在我看来,虽然它仍然不是正确的方法。操作系统负责管理每个进程中DLL模块的生命周期。这有很多方面,但是对于一个:大多数DLL实例已经在每个进程之间共享(主要是代码段,资源等 - 当然,默认情况下不共享数据)。

要解决 实际问题 ,您必须采用多进程同步技术。在Windows中,这主要通过named kernel objects工作,如互斥锁,信号量,事件等。另一种方法是使用IPC,正如其他人已经在他们各自的答案中提到的那样,然后再次需要某种同步。

可能所有这些都已由该硬件的设备驱动程序处理。与底层硬件重叠交互会对使用您的DLL的应用程序产生负面影响的真实场景是什么?

答案 3 :(得分:0)

为了确保每台计算机都加载了一个DLL,您需要在单独的AppDomain中运行控制程序集,然后尝试创建用于远程处理的命名管道(使用IpcChannel)并声明硬件资源。 IpcChannel将无法在同一环境中创建第二次。如果您需要与硬件进行高性能通信,请仅使用远程处理由应用程序使用的另一个程序集声明和释放资源。

答案 4 :(得分:0)

Mutex是独家控制多个流程的解决方案之一。

***但是Mutex有时会发生死锁。使用时要小心。