c# 关闭一个Assembly实例
Posted
技术标签:
【中文标题】c# 关闭一个Assembly实例【英文标题】:c# Closing an Assembly instance 【发布时间】:2011-08-04 13:31:44 【问题描述】:当我使用 Assembly.LoadFile 方法时,在我的程序关闭之前,我无法从外部访问加载到程序集中的文件。另一方面,StreamReader 允许我使用 StreamReader.Close()
方法在使用完流后关闭它。
在使用 Assembly.Load 时有什么方法可以做同样的事情吗?
谢谢,
埃文
【问题讨论】:
【参考方案1】:不,这是设计使然。
如果您想“卸载”程序集,您必须将其加载到单独的 AppDomain 中。
如果您只想发布文件,可以先将其加载到 byte[]
并使用(已弃用)Assembly.Load(byte[] rawAssemly)
方法。
【讨论】:
【参考方案2】:使用AppDomain.CreateDomain()
将程序集加载到新的应用程序域中,并将其与AppDomainSetup
类的新实例一起使用,并将其影子复制属性设置为true。 http://msdn.microsoft.com/en-us/library/ms404279.aspx
这将复制要加载到目录中的程序集,并且它将加载副本,而原始文件未锁定。如果您想在组装完成后进行清理,请使用 AppDomain.Unload(domain)
。
您也可以使用Assembly.Load(File.ReadAllBytes("path"))
。
【讨论】:
【参考方案3】:您可以将程序集加载到单独的 AppDomain 中,然后卸载 AppDomain - 这是唯一的方法。
【讨论】:
【参考方案4】:您可以将 DLL 文件读入byte[]
(调用File.ReadAllBytes
),然后使用字节数组调用Assembly.Load
。
程序集不会被卸载,但您可以删除文件。
【讨论】:
【参考方案5】:这是不可能的。 在 *** 中查看另一个 post。 看到这个article。
有关@BrokenGlass 的解决方案,请参阅here。
【讨论】:
以上是关于c# 关闭一个Assembly实例的主要内容,如果未能解决你的问题,请参考以下文章