DLL获取配置信息的最佳方法?
我们已经开发了许多由第三方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 ++中的操作方式。