C# Assembly.Load() 方法加载了错误的 dll?
C# Assembly.Load() method loads the wrong dll?
问题陈述
我在加载 dll 时在 C# 中实现了某种卷影复制,以防止 dll 文件被锁定。它的工作原理如下:
- 说我有 sample.dll 并且想将它加载到应用程序域而不锁定它
- 首先,我在同一目录中复制了一个名为 sample_shadow.dll 的程序集
- 然后我用Assembly.Load加载sample_shadow.dll(Assembly.LoadFrom和AssemblyName.GetAssemblyName也试过了)
- 在那之后,加载的程序集似乎具有 sample.dll 而不是 sample_shadow.dll 的基本位置,并且 sample.dll 被锁定
约束条件
我知道我可以使用 Assembly.Load(byte[]) 或 Assembly.LoadFile() 来实现这一点。但是不能用(至少我没弄明白怎么用),因为比较复杂的情况:
- 我有一个 shell dll 动态加载函数 dll
- 函数 dll 包含一些由 shell dll
更新的静态变量
- 还有3个dll引用函数dll(静态)
- 我希望三个dll能看到shell dll对函数dll中静态变量的更新...(这太多了)
- LoadFile() 或 Load(byte[]) 破坏此行为,但 Load(string) 和 LoadFrom() 保留此行为
问题
- 我想知道如何才能正确加载 sample_shadow.dll 从而防止 sample.dll 被锁定
- 如果有人能详细说明一下后台的机制,我将不胜感激
提前致谢!
您需要 LoadFile - LoadFrom 从 URI 获取程序集信息,然后加载已知程序集。此类用例明确存在 LoadFile。
“使用 LoadFile 方法加载和检查具有相同标识但位于不同路径中的程序集”
问题陈述
我在加载 dll 时在 C# 中实现了某种卷影复制,以防止 dll 文件被锁定。它的工作原理如下:
- 说我有 sample.dll 并且想将它加载到应用程序域而不锁定它
- 首先,我在同一目录中复制了一个名为 sample_shadow.dll 的程序集
- 然后我用Assembly.Load加载sample_shadow.dll(Assembly.LoadFrom和AssemblyName.GetAssemblyName也试过了)
- 在那之后,加载的程序集似乎具有 sample.dll 而不是 sample_shadow.dll 的基本位置,并且 sample.dll 被锁定
约束条件
我知道我可以使用 Assembly.Load(byte[]) 或 Assembly.LoadFile() 来实现这一点。但是不能用(至少我没弄明白怎么用),因为比较复杂的情况:
- 我有一个 shell dll 动态加载函数 dll
- 函数 dll 包含一些由 shell dll 更新的静态变量
- 还有3个dll引用函数dll(静态)
- 我希望三个dll能看到shell dll对函数dll中静态变量的更新...(这太多了)
- LoadFile() 或 Load(byte[]) 破坏此行为,但 Load(string) 和 LoadFrom() 保留此行为
问题
- 我想知道如何才能正确加载 sample_shadow.dll 从而防止 sample.dll 被锁定
- 如果有人能详细说明一下后台的机制,我将不胜感激
提前致谢!
您需要 LoadFile - LoadFrom 从 URI 获取程序集信息,然后加载已知程序集。此类用例明确存在 LoadFile。
“使用 LoadFile 方法加载和检查具有相同标识但位于不同路径中的程序集”