【发布时间】: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 被锁定
- 如果有人能详细说明后台机制,我将不胜感激
提前致谢!
【问题讨论】:
-
这个问题的答案stackoverflow.com/q/1477843/891715解释了如何和为什么
标签: c# dll reflection .net-assembly appdomain