DLL获取配置信息的最佳方法?

时间:2020-03-06 14:45:26  来源:igfitidea点击:

我们已经开发了许多由第三方Windows应用程序调用的自定义dll。这些dll将根据需要加载/卸载。

大多数dll会调用Web服务,而这些dll需要配置url,超时等。

因为dll并非永久存在于内存中,所以它每次被调用时都必须读取配置。对我来说,这似乎不是最佳选择。

有没有更好的方法来解决这个问题?

注意:可配置信息位于xml文件中,因此IT部门可以根据需要进行更改。他们将不接受注册表编辑。

注意:这些dll可以满足许多第三方应用程序的需要,它实质上实现了外部EDMS接口。供应商不接受传递必需的参数。

注意:它的a.NET应用程序和dll是用C#编写的。本质上,当它们需要执行某种EDMS操作时,既有胖客户端(Windows应用程序)也有瘦客户端访问此dll。 EDMS接口定义为必须在dll中实现的一组调用,并且dll决定如何实现EDMS功能,例如:对于某些客户,"注册文档"将更新数据库,而对于其他客户,相同的调用将使用第三方EDMS系统。没有ASP客户端。

我的理解是,当客户端要访问EDMS操作时将加载dll,然后在调用完成后将其卸载。客户端可能不需要一段时间(在某些情况下,需要一个小时以上)执行另一次EDMS操作。

解决方案

使用注册表存储配置信息,它肯定足够快。

我们为什么不让调用应用程序使用我们需要的内容来填充数据结构?可以作为init调用的一部分完成。

我认为我们需要提供更多信息。持久保存配置信息的方法有很多。我们甚至不知道开发平台。 。网?

  • 除非我确定注册表将始终可用,否则我不会依赖注册表。我们可能在客户端计算机上无法使用它,但是我们已经提到过Web服务。
  • 对于服务器端第三方dll,当前目录中的XML文件现在似乎非常流行。但是这些配置是可选的。
  • 如果是ASP,则信任级别对于选择配置持久性方法将非常重要。
  • 我们可能可以使用应用程序服务器的"应用程序范围"。在应用程序的整个生命周期中都会加载一次。如果DLL也检测到需要,则可以使该数据无效。
  • 我使用了文本文件,XML文件,数据库,各种IPC(如共享内存段,应用程序范围)来保留配置信息。这在很大程度上取决于项目的细节。

想要进一步详细说明吗?

编辑。考虑到澄清,我将处理一个XML文件。该自定义XML文件将使用已预定义和记录的搜索路径加载。如果是ASP.Net,则可以使用Server.MapPath()例如检查各种文件夹,例如App_Data。 DLL会首先检查当前目录中的配置文件。然后,我们可以使用"管理器"线程来保存配置数据,并将其传递给任何需要它的子线程。共享可以像共享内存段一样使用IPC。

这似乎很麻烦,但是我们必须将信息存储在某个范围内...或者来自磁盘,内存(应用程序范围,会话范围,DLL全局范围,另一个进程/ IPC等)。

ASP.Net还使我们能够将自定义配置部分添加到标准配置文件(如web.config)中。我们可以随意访问这些部分,它们将不依赖于DLL的加载时间。

为什么我们认为DLL已从内存中删除?

该dll多久被卸载一次? COM dll可以通过DllCanUnload方法控制何时卸载它们。如果这些是COM组件,则可以在此处实施某种超时以防止频繁加载和卸载。除非dll以很高的频率重新加载配置,否则不太可能成为真正的性能瓶颈。

知道dll将在某些时候重新加载其配置是一项有用的功能,因为它可以防止用户怀疑是否必须重新启动主机进程,重新启动计算机等才能使配置生效。我们甚至可以查看文件中的更改以使其保持最新状态。

我认为DLL获取配置信息的最佳方法是通过使用隐式" Init"调用(如建议的Nils)或者通过其配置文件使用它的应用程序。

DLL通常不应该"自行配置",因为它们无法确定在哪种上下文中使用它们。不同的用户(如在应用程序中)可能具有不同的配置设置。

因为我们说过应用程序是用.NET编写的,所以我们可能只需要他们将DLL功能的必要配置放入其配置文件(" whatever.exe.config")中,然后通过AppSettings甚至从DLL中访问它即可通过自定义配置部分更好。

此外,我们可能想为可能的设置提供合理的默认值(尽管可能不是网络地址)。

如果仅在每1小时左右的时间间隔内从内存中加载和卸载dll,则由于mslal初始化(读取文件/注册表)而导致的效率低下可以忽略不计。

但是,如果这种情况更加频繁,则加载和卸载dll的物理行为将导致更高的效率低下。与小的初始化相比,这可能更多地是效率低下。

因此,最好将它们固定在内存中。这样,在加载时执行的初始化就不会重复,并且还避免了加载和卸载的效率低下。我们可以通过这种方式解决2个问题。

我可以告诉你如何用C ++做到这一点。不知道如何在C#中执行此操作。 GetModuleHandle +在此句柄上进行额外的LoadLibrary调用是我在C ++中的操作方式。