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中的静态变量的更新……(这个太多了) LoadFile() 或 Load(byte[]) 会破坏此行为,但 Load(string) 和 LoadFrom() 会保留此行为问题
-
我想知道如何正确加载 sample_shadow.dll 从而防止 sample.dll 被锁定
如果有人能详细说明后台机制,我将不胜感激
提前致谢!
【问题讨论】:
这个问题的答案***.com/q/1477843/891715解释了如何和为什么 【参考方案1】:您需要 LoadFile - LoadFrom 从 URI 获取程序集信息,然后加载已知程序集。 LoadFile 明确存在于这种类型的用例中。
“使用 LoadFile 方法加载和检查具有相同标识但位于不同路径的程序集”
【讨论】:
以上是关于C# Assembly.Load() 方法加载了错误的 dll?的主要内容,如果未能解决你的问题,请参考以下文章
关于C#反射Assembly.load() .CreateInstance() 未报错, 返回对象为空