【问题标题】:C# Restricting DLL's to only one instanceC# 将 DLL 限制为仅一个实例
【发布时间】:2015-06-26 12:29:33
【问题描述】:

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

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

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

【问题讨论】:

  • 我相信您的意思是使用 Singleton pattern 但不是一个 dll 实例,而是只有一个特定对象的实例。
  • 您好,这可能会有所帮助,stackoverflow.com/questions/1038111/…
  • 使用一个有名字的事件,如果事件存在,这不是第一个实例并且失败。

标签: c# .net dll


【解决方案1】:

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

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

【讨论】:

  • 您将如何解决这一点但是我希望它是不同应用程序使用的同一个 dll 实例
  • @Rahul 哦,我完全错过了这一点。谢谢,我会澄清的。
  • 那么顶级应用程序将如何与 API 通信?
  • @Danielhobby 取决于你的 API 是什么样的。如果您的 Windows 服务将公开 WCF 服务,则 Visual Studio(和一般的 .NET Framework)具有内置工具。如果是 (REST) HTTP API,则需要编写自定义客户端。
【解决方案2】:

你不能按照你的意愿去做。做到这一点的最佳方法是拥有一个接收和处理消息的进程(DLL 不是一个进程),并让您的多个客户端使用一个 API(这将是您的 DLL)只向该进程发送消息。

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

【讨论】:

    【解决方案3】:

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

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

    要解决您的实际问题,您将不得不求助于多进程同步技术。在 Windows 中,这主要通过named kernel objects 工作,例如互斥锁、信号量、事件等。另一种方法是使用IPC,正如其他人在他们各自的答案中已经提到的那样,这本身又需要某种同步。

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

    【讨论】:

    • 如果使用 DLL 的两个应用程序要求硬件在相同或相似的时间执行某项操作,那么结果就会混淆。我想避免这种情况。我认为这样做的解决方案是共享 DLL。
    • @Danielhobby 我认为使用系统范围的互斥锁来同步对硬件的访问比编写服务更容易。
    • @AlexDev 我正在努力寻找一个很好的互斥锁示例。有什么我可以看看的想法吗?
    • 上次我需要它时,我发现信息散落在 SO 和其他一些地方,甚至不得不更正它,在我的情况下,使用 EventWaitHandle 结束,因为互斥体在线程退出在我的情况下并不好,但在你的情况下,我认为这就是你需要的。
    • 你可以看看stackoverflow.com/questions/2186747msdn.microsoft.com/en-us/library/system.threading.mutex.aspx。请记住在名称中使用“Global\”,并注意 AbandonedMutexException。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      Mutex 是多进程独占控制的解决方案之一。

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

      【讨论】:

      • 我假设您的意思与 Leandro Taset 相同,但您应该更清楚。
      猜你喜欢
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2021-10-25
      • 2019-04-24
      • 1970-01-01
      • 2016-03-30
      相关资源
      最近更新 更多