代码之家  ›  专栏  ›  技术社区  ›  Andy E

assembly.load(byte[])和assembly.location/assembly.codebase

  •  3
  • Andy E  · 技术社区  · 15 年前

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

    我知道您可以通过卷影复制来实现这一点,但要使其正常工作真的很困难,某些论坛上的一些用户建议将程序集加载到字节数组中,并使用assembly.load(byte[])重载。在其中一个程序集尝试访问其父目录中的文件之前,此操作非常有效,因为assembly.location返回空字符串和程序集。codebase返回加载程序集的应用程序的位置。

    我能做些什么来设置我正在加载的程序集的代码库或位置属性吗?在代码库和位置的msdn文档中,它们被定义为可重写的属性——这是否意味着我可以从宿主应用程序重写它们?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Rubens Farias    15 年前

    你能用吗? AppDomainSetup.ApplicationBase ?还是需要为加载的每个程序集定义该路径?

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

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

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

        2
  •  0
  •   Gabe Timothy Khouri    14 年前

    用途:

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

    但您仍然需要在另一个AppDomain中执行此操作。

    推荐文章