多个应用程序域调用同一个非托管dll

4
我们的.NET 3.5 C#应用程序创建多个应用程序域。每个应用程序域加载相同的非托管第三方dll。该dll在初始化时读取配置文件。如果配置在运行时更改,则必须卸载并重新加载该dll。我们无法正确重写此dll。
每个应用程序域是否可以访问此非托管dll的单独副本,还是Windows保留了一个dll并维护使用计数?如果是后者,我们如何使每个非托管dll实例反映其唯一的配置?

当你说“Load”时,是指通过LoadLibrary吗? - leppie
建议您更详细地说明配置文件更改的确切情况:是什么导致了更改:您是否意味着在任意时间间隔内创建一个新的应用程序域,然后读取可能已被正在进行的应用程序更改的配置文件?因此,每当配置文件更改时,所有使用先前配置文件加载的dll必须被卸载并重新加载?因此,给定的'dll在收到通知配置文件已更改时无法重新配置自身?听起来像是一个设计噩梦。 - BillW
Leppie - 我所说的“Load”是指LoadLibrary。 BillW - 我同意,这是一个设计噩梦,超出了我们的控制范围。我们现在需要与之一起工作。配置文件会在用户需要在“项目”之间切换(在此上下文中不重要)时更改,并且可能随时发生。 - Mr. T.
1个回答

0

我认为未托管的dll只会被操作系统在进程中加载一次,因此每个应用程序域将具有相同的已加载实例。要卸载dll,请使用FreeLibrary函数。但是,由于多个应用程序域可能已加载了dll,因此无法保证来自一个应用程序域的FreeLibrary实际上会释放/卸载dll。

正如BillW所说,这对我来说似乎也是一个设计噩梦!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接