没有锁定DLL的动态类型实例化

时间:2012-10-25 08:55:24

标签: c# dll com+

我有一个 COM +应用程序,由多个服务组件组成。

其中一个根据需要实例化一个从dll到Activator.CreateInstance(pluginType, args);的类型。该类型本身不是服务组件,它只包含组件知道的某些接口的实现。

我没有实例化本身的问题,问题是dll被dllhost.exe锁定了,如果可能的话,我希望能够在不关闭COM +的情况下替换它应用

是否有可能在不关闭COM + App的情况下以某种方式解锁dll?

或者从另一个角度来看,有没有办法可以通过编程方式卸载dll来解锁它?

注意: dll位于COM +应用程序根目录中,其余的dll。

2 个答案:

答案 0 :(得分:1)

这不是COM +的特定问题,它在Windows上是通用的,并且是它工作方式的基础。从可执行文件(exe或dll)加载代码是由Windows为可执行文件创建内存映射文件。当页面错误需要实际读取文件并将代码映射到RAM时,才会从文件中读取代码。当其他进程争用RAM并且代码未映射时,这将反复发生。

MMF锁定文件。必需,以便在代码映射到RAM时无法修改文件。

没有解决方法,加载DLL的进程必须终止或必须在释放锁之前配合和卸载DLL。充其量,您可以在文件正在使用时重命名该文件,否则不会影响该过程。

答案 1 :(得分:1)

在Windows中引用已加载的模块。在windows中我们有loadLibrary和freelibrary。如果调用freelibrary并且引用计数为零,那么dll将被卸载并可以自由替换,删除等。

在.NET中虽然程序集被加载到appDomain中,但它一直存在,直到appdomain死掉(除非反射发出可收集的程序集)。如果您要生成另一个appdomain并在新的appdomain死亡时执行create instance,则将卸载程序集。

Asp.net做了一个叫阴影缓存的事情。 Asp.net您可以随时替换dll而无需杀死工作进程。他们这样做是因为没有在bin文件夹中加载dll,而是将它们复制到一个单独的位置,并从单独的appdomain中加载它们。他们观察bin文件夹,当发生更改时,他们会杀死appdomain,将dll复制到temp文件夹,然后创建一个新的appdomain。

卷影复制装配 http://msdn.microsoft.com/en-us/library/ms404279.aspx