【问题标题】:c# Closing an Assembly instancec# 关闭一个Assembly实例
【发布时间】:2011-08-04 13:31:44
【问题描述】:

当我使用 Assembly.LoadFile 方法时,在我的程序关闭之前,我无法从外部访问加载到程序集中的文件。另一方面,StreamReader 允许我使用 StreamReader.Close() 方法在使用完流后关闭它。

在使用 Assembly.Load 时有什么方法可以做同样的事情吗?

谢谢,

埃文

【问题讨论】:

    标签: c# .net reflection


    【解决方案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】:

            这是不可能的。 在 stackoverflow 中查看另一个 post。 看到这个article

            有关@BrokenGlass 的解决方案,请参阅here

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-12-02
              • 1970-01-01
              • 1970-01-01
              • 2014-01-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-09-12
              相关资源
              最近更新 更多