如果我有同一个进程的多个实例访问某个DLL,有没有办法让这些进程之一获得它的锁,删除它,replace它,并继续?
检查第二个显示器是否以.NET连接(双显示器设置,笔记本电脑和扩展坞)
如何为Windows窗体应用程序创build安装程序和卸载程序
清单的supportedOS设置实际上在幕后做了什么?
是否有可能以编程方式更改USB < – >串行转换器的“BM”延迟选项?
TimeZoneInfo和CultureInfo的System.DateTime和Caching
为了能够替换正在使用的dll,使用它们的程序必须在“ Shadow copy ”模式下拥有其应用程序域。 这样做不是直接使用该文件,而是使用该程序集复制文件并将该文件加载到内存中。 这使您可以替换或删除当前正在运行的应用程序的DLL,当应用程序下一次重新启动时,它将获取当前版本的新副本。 这就是IIS如何让您更新正在使用的网站,它会复制它的程序集,当它检测到目录的更改时,它将重新启动加载新版本的网站的网站。
Shadow copy设置是AppDomain级别的设置 ,但是一旦AppDomain启动,您将无法更改设置。
启用Shadow copy的两种方法是使用在程序之前启动的一个小的“Loader”应用程序域,该加载程序启动一个启用了Shadow copy的新AppDomain,然后启动您的程序集。
private static void Main(string[] args) { if (AppDomain.CurrentDomain.ShadowcopyFiles == false) { var assembly = Assembly.GetEntryAssembly(); var currentAppDomain = AppDomain.CurrentDomain; AppDomain newDomain = AppDomain.CreateDomain("ShadowedDomain",null,currentAppDomain.BaseDirectory,currentAppDomain.RelativeSearchPath,true); //<-- This true is what enables Shadow copy on the AppDomain. //This calls Main again in the new AppDomain and blocks till the call to Main exits. newDomain.ExecuteAssembly(assembly.Location,args); } else { RealMain(args); } } private static void RealMain(string[] args) { //Your code here. }
一个缺点是你的主EXE将仍然被锁定,但任何DLL的EXE加载将使用影子副本加载。
另一个选项与第一个类似,但是您可以告诉自己的程序集使用自定义加载程序来启用Shadow copy,而不是手动运行加载程序并将其指向程序集。 要做到这一点首先做一个单独的DLL,将作为加载程序,并包含从AppDomainManager派生的类,这个文件将不被阴影复制。
using System; namespace DomainManager { public class ShadowDomainManager : AppDomainManager { public override void InitializeNewDomain(AppDomainSetup appDomainInfo) { base.InitializeNewDomain(appDomainInfo); appDomainInfo.ShadowcopyFiles = "true"; } } }
然后在你的程序集的app.config ,你可以告诉它使用你的加载DLL。
<?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> <runtime> <appDomainManagerType value="DomainManager.ShadowDomainManager" /> <appDomainManagerAssembly value="DomainManager,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" /> </runtime> </configuration>
现在,您的exe文件和它加载的任何DLL(存储在应用程序目录或其子目录中)将被加载到一个影子复制的应用程序域中,并且可以在使用时被删除/替换。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。