我有一些关于 DLL 的设计问题,我目前在你可能称之为它的地方,正如维基百科所指的那样DLL Hell问题如下:
我创建了一个系统,该系统具有多个实现为 DLL 的模块。这些在应用程序中使用,并且可以加载 DLL,但并非所有这些都是必需的。如果只完成数学之类的事情,它可以链接到“Utilities.dll”并使用它。问题是,我有一个记录器/跟踪器。这会将所有内容记录到一个文件和一个调试控制台中,调试控制台只是一个流输出。问题是如何处理多个 DLL 尝试使用同一个日志类。看到日志类在这个“Utilities.dll”中,“DataManagers.dll”和其他 dll 之类的东西也想使用日志类功能。这包括登录到文件。我目前正在使用临界区来确保不会发生写入冲突,但看到临界区是在用户模式下实现的 d 必须在某些时候切换到互斥锁或类似的东西才能拥有内核模式对象。但是,如果我只使用关键部分,那么在 DLL 内存中拥有多个日志类实例意味着我会遇到一些严重的问题。
我似乎无法一起困惑的是,所有 DLL 都能够使用相同的日志类实例,而不必一个一个地链接到 Utilities.dll。我不想将 8 个 dll 加载到我的演示项目中,并让所有这 8 个引用带有日志类的那个 dll,如果我需要更多类似日志类的东西,这将是一个连锁反应。有没有办法正确地做到这一点?使用类的功能,在其他 DLL 中的 DLL 中使用静态函数,在 .exe Windows 二进制文件中使用相同的“静态”函数,从而不会在写入日志文件甚至调试控制台的输出流时发生冲突。
如果我完全错了并试图做不可能的事情,请告诉我并帮助实现尽可能接近此的目标。我知道在 DLL 中使用 Singleton 模式时会出现一些类似的问题,但这可以通过以下方式解决
到目前为止我已经尝试过:
- 初始化 DLL 的类时,给它们一个日志库的实例,但这违背了类具有所有静态成员的目的。
我也发现了这个问题,它是 similair (甚至我的全局工具的库的名称都在那个..)但它没有回答我的问题并且有一些不同的方法以及来自 '09 . 如何模仿静态库的“应用程序中全局变量的多个实例”行为但使用 DLL?