C# Assembly.Load() 方法加载了错误的 dll?

Posted

技术标签:

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

问题陈述

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

    假设我有 sample.dll 并希望将其加载到 appdomain 中而不锁定它 首先,我在同一目录中复制名为 sample_shadow.dll 的程序集 然后我用 Assembly.Load 加载 sample_shadow.dll(Assembly.LoadFrom 和 AssemblyName.GetAssemblyName 也试过) 之后,加载的程序集似乎具有 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() 会保留此行为

问题

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

提前致谢!

【问题讨论】:

这个问题的答案***.com/q/1477843/891715解释了如何和为什么 【参考方案1】:

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

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

【讨论】:

以上是关于C# Assembly.Load() 方法加载了错误的 dll?的主要内容,如果未能解决你的问题,请参考以下文章

Assembly.Load

关于C#反射Assembly.load() .CreateInstance() 未报错, 返回对象为空

java 工厂assembly.load怎么用

反射使用反射

Assembly.LoadFrom() 或 Assembly.Load() 能够删除文件

c#如何获取某一命名空间下的所有的类的信息(方法以及参数)