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