C#限制DLL';它只适用于一个实例

C#限制DLL';它只适用于一个实例,c#,.net,dll,C#,.net,Dll,我本质上希望为应用程序创建一个api,但我只希望该dll的一个实例一次运行 因此,多个应用程序也需要能够同时使用DLL。正如您对普通api的期望 但是,我希望它是不同应用程序使用的dll的同一个实例。这是因为我不希望与硬件通信重叠。DLL通常在每个进程中加载一次,因此,如果您的应用程序保证仅在单实例模式下运行,则无需执行其他操作。您的单个应用程序实例将只有一个加载的DLL 现在,如果您想在应用程序之间“共享”DLL的“单个实例”,您将不可避免地不得不求助于客户机-服务器体系结构。您的DLL必须包

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

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

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

DLL通常在每个进程中加载一次,因此,如果您的应用程序保证仅在单实例模式下运行,则无需执行其他操作。您的单个应用程序实例将只有一个加载的DLL


现在,如果您想在应用程序之间“共享”DLL的“单个实例”,您将不可避免地不得不求助于客户机-服务器体系结构。您的DLL必须包装在Windows服务中,该服务将公开HTTP(或WCF)API。

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

您不能按预期的方式执行此操作。最好的方法是使用一个进程(DLL不是进程)来接收和处理消息,并让您的多个客户端使用一个API(这将是您的DLL)来向该进程发送消息


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

互斥是一种对多个进程进行独占控制的解决方案

***但互斥有时会死锁发生。使用时要小心。

这是一种问题。您的实际需求是序列化与底层硬件的交互,所以它们不会重叠。也许这就是你应该明确而具体地问的问题

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

要解决实际问题,您必须求助于多进程同步技术。在Windows中,这主要通过互斥体、信号量、事件等方式工作。另一种方法是使用,正如其他人在各自的回答中已经提到的,这同样需要某种同步


也许所有这些都已经由硬件的设备驱动程序处理了。在什么情况下,与底层硬件的重叠交互会对使用DLL的应用程序产生负面影响?

我相信您的意思是使用
单例模式
,但不是使用DLL的一个实例,而是只使用特定对象的一个实例。您好,这可能会有所帮助,使用具有名称的事件,如果该事件存在,则这不是第一个实例并且失败。您将如何解决这一点?但是,我希望它是不同应用程序使用的dll的同一个实例use@Rahul哦,我完全没有抓住那一点。谢谢,我会澄清。那么顶级应用程序如何与API通信?@Danielhobby,这取决于API的外观。如果您的Windows服务将公开WCF服务,则VisualStudio(以及generl中的.NET Framework)具有内置工具。如果是(REST)HTTP API,则需要编写自定义客户端。如果使用DLL的两个应用程序要求硬件在相同或类似的时间执行某些操作,则会出现结果混乱。我想避免这种情况。我认为这样做的解决方案是共享DLL。@Danielhobby我认为使用一个名为mutex的系统范围的互斥来同步对硬件的访问比编写一个服务更容易。@AlexDev我正在努力寻找一个运行互斥的好例子。有什么想法吗?上次我需要它时,我发现信息分散在某处和其他一些地方,甚至不得不更正它,在我的例子中,最后使用了
EventWaitHandle
,因为线程退出时互斥被放弃,这在我的例子中并不好,但在你的情况下,我认为这是你需要的。你可以看看和。请记住在名称中使用“Global”,并注意废弃的mutexception。我假设您的意思与Leandro Taset相同,但您应该让它更清楚。