2008-09-25 50 views
0

我们开发了一些由第三方Windows应用程序调用的自定义dll。这些dll根据需要被加载/卸载。dll获取配置信息的最佳方式?

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

因为dll不是永久存储在内存中,所以每次调用时都必须读取配置。这对我来说似乎不太合适。

有没有更好的方法来处理这个问题?

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

注意:这些dll满足许多第三方应用程序,它实际上实现了一个外部EDMS接口。供应商不会接受通过所需的参数。

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

我的理解是,当客户端想要访问EDMS操作时加载dll,然后在通话结束时卸载dll。客户可能不需要在一段时间内进行另一次EDMS操作(在某些情况下超过一小时)。

回答

1

使用注册表来存储您的配置信息,这绝对够快。

+0

IT部门没有理由抱怨。如有必要,请准备一个编辑相关注册表值的工具,但注册表是在Windows平台上存储配置信息的最佳位置。甚至有远程编辑注册表的工具。它的安全。 – 2008-10-17 07:48:02

0

你为什么不让调用应用程序用你需要的东西填写数据结构?可以作为初始化调用的一部分来完成。

1

我认为你需要提供更多信息。在持续配置信息方面有很多方法。我们甚至不知道开发平台。 。净?

  1. 我不会依赖注册表,除非我确定它始终可用。您可能会在客户端计算机上摆脱这种情况,但您已经提到过web服务。

  2. 当前目录中的XML文件似乎现在非常受服务器端第三方dll的欢迎。但是这些配置是可选的。

  3. 如果这是ASP,您的Trust Level在选择配置持久性方法时非常重要。

  4. 您可以使用应用程序服务器的“应用程序范围”。在应用程序的每个生命周期中加载一次。如果它发现它也需要,你的DLL可以使这些数据无效。

  5. 我已经使用了文本文件,XML文件,数据库,各种IPC(如共享内存段,应用程序范围)来保存配置信息。这很大程度上取决于您项目的具体情况。

有待进一步阐述?

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

这似乎是麻烦,但你必须存储在某些范围内的信息......无论是从磁盘,内存(适用范围,会话范围,DLL全球范围内,另一个进程/ IPC等)

ASP .Net还允许您将custom configuration sections添加到标准配置文件(如web.config)中。您可以随意访问这些部分,并且不会依赖于何时加载DLL。

为什么你相信你的DLL被从内存中删除?

0

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

知道该DLL将在某些点重新加载其配置是一个有用的功能,因为它可以防止用户想知道他们是否必须重新启动主机进程,重新启动机器等以使配置生效。您甚至可以观察文件的更改以保持最新。

0

我认为DLL获取配置信息的最佳方式是通过使用它的应用程序 - 或者通过隐含的“Init” - 调用,比如Nils建议的,或者通过配置文件。

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

既然你说应用程序是用.NET编写的,那么你可能只需要它们为你的DLL的函数在配置文件(“whatever.exe.config”)中进行必要的配置并从中进行访问你的DLL通过AppSettings甚至更好的通过自定义配置部分。

此外,您可能希望为可能的设置提供合理的默认值(可能不适用于网络地址)。

0

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

但是,如果这种情况更频繁,那么更高效的低效率就是加载和卸载dll的物理行为。这可能比小的初始化更有效。

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

我可以告诉你如何在C++中做到这一点。不知道你会如何在C#中做到这一点。 GetModuleHandle +在这个句柄上额外调用一个LoadLibrary是我如何在C++中完成的。

0

一种方法是在DLL中有一个指定所需设置的接口。

然后,在“应用程序项目”中有一个实现此接口的类并在启动时将它传递给DLL,这使您可以根据项目自由更改实现。有人可能从web.config读取,而另一个人从数据库读取数据。