【问题标题】:Assembly.Load(Byte[]) and Assembly.Location/Assembly.CodebaseAssembly.Load(Byte[]) 和 Assembly.Location/Assembly.Codebase
【发布时间】:2009-10-19 12:44:14
【问题描述】:

我正在尝试加载程序集而不锁定文件。这些程序集可能是第三方程序集,因此我们不一定有权访问代码,其中一两个使用 Assembly.Location 从其目录中读取文件,这些文件可能依赖于这些文件。

我知道你可以通过影子复制来做到这一点,但让它正常工作真的很痛苦,某些论坛上的一些用户建议将程序集加载到字节数组中并使用 Assembly.Load(Byte[])超载。这在其中一个程序集尝试访问其父目录中的文件之前非常有效,因为 Assembly.Location 返回一个空字符串,而 Assembly.Codebase 返回加载程序集的应用程序的位置。

我可以做些什么来设置我正在加载的程序集的 Codebase 或 Location 属性吗?在 Codebase 和 Location 的 MSDN 文档中,它们被定义为可覆盖的属性 - 这是否意味着我可以从托管应用程序中覆盖它们?

【问题讨论】:

  • 阴影应对可能是最好的解决方案...

标签: .net codebase assembly.load


【解决方案1】:

你可以使用AppDomainSetup.ApplicationBase 吗?或者您是否需要为您加载的每个程序集定义该路径?

编辑:使用文件名很容易定义代码库:

AssemblyName assemblyRef = new AssemblyName();
assemblyRef.CodeBase = assemblyFile;
Assembly assembly = Assembly.Load(assemblyRef);

也许你可以使用AppDomain.AssemblyLoadAssembly.ModuleResolve 事件,但我怀疑。

【讨论】:

  • 每个加载的程序集都将从不同的路径加载,因此每个程序集都需要不同的位置或代码库属性。
  • 问题是使用文件名会锁定程序集 dll 并阻止它被文件系统删除(或更重要的是,覆盖)。
  • 考虑一下我在 CodeProject 上创建的这篇文章:codeproject.com/KB/WCF/generic_wcf_host.aspx;控制台主机不会锁定您的程序集
【解决方案2】:

使用::

var assembly = Assembly.ReflectionOnlyLoad(System.IO.File.ReadAllBytes(yourFullfileNamePath));

但您仍然需要在不同的 AppDomain 中执行此操作。

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多