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实例的主要内容,如果未能解决你的问题,请参考以下文章

关于C#反射Assembly.load() .CreateInstance() 未报错, 返回对象为空

C# 反射类Assembly用法举例

关于c#中internal用法

c# assembly 反射 dll和xml

C#反射Assembly 详细说明

《CLR Via C#》使用CSC.exe将module组合成assembly