【问题标题】:C# Assembly.Load() method loads the wrong dll?C# Assembly.Load() 方法加载了错误的 dll?
【发布时间】:2020-07-22 12:55:28
【问题描述】:

问题陈述

我在加载 dll 时在 C# 中实现了某种影子复制,以防止 dll 文件被锁定。它的工作原理如下:

  1. 假设我有 sample.dll 并希望将其加载到 appdomain 中而不锁定它
  2. 首先,我在同一目录中复制名为 sample_shadow.dll 的程序集
  3. 然后我用 Assembly.Load 加载 sample_shadow.dll(Assembly.LoadFrom 和 AssemblyName.GetAssemblyName 也试过)
  4. 之后,加载的程序集似乎具有 sample.dll 而不是 sample_shadow.dll 的基本位置,并且 sample.dll 被锁定

约束

我知道我可以使用 Assembly.Load(byte[]) 或 Assembly.LoadFile() 来实现这一点。但是由于情况相当复杂,它们无法使用(至少我不知道如何使用):

  • 我有一个动态加载函数 dll 的 shell dll
  • 函数 dll 包含一些由 shell dll 更新的静态变量
  • 还有另外三个引用函数 dll(静态)的 dll
  • 希望三个dll能看到shell dll生成的函数dll中的静态变量的更新……(这个太多了)
  • Lo​​adFile() 或 Load(byte[]) 会破坏此行为,但 Load(string) 和 LoadFrom() 会保留此行为

问题

  1. 我想知道如何正确加载 sample_shadow.dll 从而防止 sample.dll 被锁定
  2. 如果有人能详细说明后台机制,我将不胜感激

提前致谢!

【问题讨论】:

标签: c# dll reflection .net-assembly appdomain


【解决方案1】:

您需要 LoadFile - LoadFrom 从 URI 获取程序集信息,然后加载已知程序集。 LoadFile 明确存在于这种类型的用例中。

“使用 LoadFile 方法加载和检查具有相同标识但位于不同路径的程序集”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多