我们开发了许多由第三方Windows应用程序调用的自定义dll。这些dll根据需要加载/卸载。
大多数dll都调用Web服务,这些服务需要配置URL,超时等。
因为dll不是永久存储在内存中,所以每次调用时都必须读取配置。这对我来说似乎不太理想。
有没有更好的方法来解决这个问题?
注意:可配置信息位于xml文件中,以便IT部门可以根据需要进行更改。他们不接受注册表编辑。
注意:这些dll适用于许多第三方应用程序,它实际上实现了一个外部EDMS接口。供应商不接受传递所需的参数。
注意:它是一个.NET应用程序,而dll是用C#编写的。本质上,有厚(Windows应用程序)和瘦客户端在需要执行某种EDMS操作时访问此dll。 EDMS接口被定义为必须在dll中实现的一组调用,并且dll决定如何实现EDMS功能,例如,对于某些客户,“注册文档”将更新数据库,而对于其他客户,相同的调用将使用第三方EDMS系统。没有ASP客户端。
我的理解是当客户端想要访问EDMS操作时加载dll,然后在调用完成时卸载。客户端可能暂时不需要进行另一次EDMS操作(在某些情况下超过一小时)。
答案 0 :(得分:1)
使用注册表存储您的配置信息,这肯定足够快。
答案 1 :(得分:1)
我认为您需要提供更多信息。持久化配置信息的方法很多。我们甚至不知道开发平台。达网络?
除非我确定它始终可用,否则我不会依赖注册表。您可能会在客户端计算机上使用它,但您已经提到过webservices。
当前目录中的XML文件现在对服务器端第三方dll来说非常流行。但这些配置是可选的。
如果这是ASP,那么您选择配置持久性方法时Trust Level非常重要。
您可以使用应用程序服务器的“应用程序范围”。每个应用程序的生命周期加载一次。如果您的DLL在检测到需要时也会使该数据无效。
我使用了文本文件,XML文件,数据库,各种IPC,如共享内存段,应用程序范围,来保存配置信息。这在很大程度上取决于项目的具体情况。
需要进一步详细说明吗?
EDIT。考虑到您的澄清,我会使用XML文件。将使用已预定义并记录的搜索路径加载此自定义XML文件。如果这是ASP.Net,您可以使用Server.MapPath()来检查各种文件夹,如App_Data。 DLL会首先检查当前目录中的配置文件。然后,您可以使用保存配置数据的“管理器”线程,并将其传递给任何需要它的子线程。共享可以像使用共享内存段一样使用IPC。
这看起来很麻烦,但你必须将信息存储在某个范围内......来自磁盘,内存(应用程序范围,会话范围,DLL全局范围,另一个进程/ IPC等)
ASP.Net还允许您将custom configuration sections添加到标准配置文件,如web.config。您可以随意访问这些部分,它们不依赖于DLL的加载时间。
为什么你认为你的DLL正从内存中删除?
答案 2 :(得分:0)
为什么不让调用应用程序用你需要的东西填写数据结构?可以作为初始化调用的一部分来完成。
答案 3 :(得分:0)
dll多久卸载一次? COM dll可以控制何时通过DllCanUnload方法卸载它们。如果这些是COM组件,您可以在此处查看实现某种超时以防止频繁加载和卸载。除非dll以很高的频率重新加载配置,否则它不太可能成为真正的性能瓶颈。
知道dll将在某些点重新加载其配置是一个有用的功能,因为它可以防止用户想知道他们是否必须重新启动主机进程,重启机器等以使配置生效。您甚至可以查看文件以进行更改以使其保持最新。
答案 4 :(得分:0)
我认为DLL获取配置信息的最佳方式是通过使用它的应用程序 - 通过隐式“Init”调用,如Nils建议,或通过其配置文件。
DLL通常不应“自行配置”,因为它们永远无法确定它们在哪种上下文中使用。不同的用户(如在应用程序中)可能具有不同的配置设置。
由于您说该应用程序是用.NET编写的,您可能只需要它们将您的DLL函数的必要配置放在其配置文件中(“whatever.exe.config”)并通过AppSettings从您的DLL访问它,甚至通过自定义配置部分访问它。
此外,您可能希望为可能的设置提供合理的默认值(但可能不适用于网络地址)。
答案 5 :(得分:0)
如果dll仅在每1小时左右的间隙从内存中加载和卸载,则由于mslal初始化(读取文件/注册表)而导致的效率可忽略不计。
然而,如果这种情况更频繁,那么更高效率就是装载和卸载dll的物理行为。这可能更多的是效率低而不是小的初始化。
因此将它们固定在内存中可能会更好。这样,在加载时执行的初始化不会重复,您也可以避免加载和卸载的效率。你这样解决了2个问题。
我可以告诉你如何在C ++中做到这一点。不确定如何在C#中执行此操作。 GetModuleHandle +在这个句柄上进行额外的LoadLibrary调用就是我在C ++中如何做到这一点。
答案 6 :(得分:0)
一种方法是在DLL中使用一个指定所需设置的接口。
然后由“应用程序项目”来创建一个实现此接口的类并在启动时将其传递给DLL,这使您可以根据项目自由更改实现。有人可能从web.config读取而另一个从DB读取。