动态类型实例化而无需锁定DLL



我有一个由几个服务组件组成的 com application

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

我没有实例化本身的问题,问题是DLL被dllhost.exe锁定,如果可能的话,我希望能够替换它而不关闭COM 应用程序。

是否有可能以某种方式解锁DLL而不关闭COM APP?

或从另一个角度来看,有什么方法可以通过编程方式卸载DLL来解锁它?

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

在Windows中计数已计数的加载模块。在窗户中,我们有负载和自由职业。如果调用Freelibrary且参考计数为零,则DLL将被卸载并免费替换,删除等。

in .net虽然将一个组件加载到AppDomain中,但它一直在那里,直到AppDomain死亡(除非反射发射可收集的组件)。如果您要产生另一个AppDomain,并在新应用程序死亡时在此处进行创建实例。

ASP.NET做一些称为阴影缓存的事情。ASP.NET您可以随时替换DLL,而无需杀死工作过程。他们通过不将DLL加载到BIN文件夹中来做到这一点,而是将其复制到单独的位置并将其从那里加载到单独的AppDomain中。他们观看BIN文件夹,当发生更改时,他们杀死了AppDomain,将DLL复制到临时文件夹,然后创建一个新的AppDomain。

阴影复制组件http://msdn.microsoft.com/en-us/library/ms404279.aspx

这不是com 的特定问题,它在窗口上是普遍的,并且基础是其工作方式。从可执行文件(EXE或DLL)加载代码是通过为可执行文件创建内存映射的文件来完成的。仅当页面故障需要实际读取文件并将代码映射到RAM时,代码才会从文件中读取。当其他流程竞争RAM并且代码未上限时,这将反复发生。

MMF将锁定在文件上。需要,以使文件在将代码映射到RAM时无法修改。

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

最新更新