0

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

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

因为 dll 不是永久保存在内存中的,所以每次调用它都必须读取配置。这对我来说似乎不是最理想的。

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

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

注意:这些 dll 为许多第三方应用程序提供服务,它本质上实现了一个外部 EDMS 接口。供应商不接受传递所需的参数。

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

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

4

7 回答 7

1

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

于 2008-09-25T23:40:36.137 回答
1

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

  1. 除非我确定它始终可用,否则我不会依赖注册表。您可能会在客户端机器上侥幸逃脱,但您已经提到了 Web 服务。

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

  3. 如果这是 ASP,那么在选择配置持久性方法时,您的信任级别将非常重要。

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

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

想进一步详细说明吗?

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

这看起来很麻烦,但是您必须将信息存储在某个范围内……来自磁盘、内存(应用程序范围、会话范围、DLL 全局范围、另一个进程/IPC 等)

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

为什么您认为您的 DLL 正在从内存中删除?

于 2008-09-25T23:50:20.747 回答
0

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

于 2008-09-25T23:41:56.790 回答
0

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

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

于 2008-09-25T23:50:59.903 回答
0

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

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

既然你说应用程序是用 .NET 编写的,你可能应该简单地要求他们将你的 DLL 函数的必要配置放在他们的配置文件(“whatever.exe.config”)中,并通过 AppSettings 甚至从你的 DLL 访问它通过自定义配置部分更好。

此外,您可能希望在可能的情况下为设置提供合理的默认值(尽管可能不是网络地址)。

于 2008-09-26T04:40:46.367 回答
0

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

但是,如果这种情况更频繁,则更高的低效率将是加载和卸载 dll 的物理操作。这可能比小的初始化效率低得多。

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

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

于 2008-09-26T04:48:32.557 回答
0

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

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

于 2012-01-23T12:02:25.997 回答