Assembly.Load

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Assembly.Load相关的知识,希望对你有一定的参考价值。

参考技术A Assembly.Load可以从内存、文件中加载程序集,主要的重载方法有:
Load(Byte[]):加载带有基于通用对象文件格式 (COFF) 的映像的程序集,该映像包含已发出的程序集。 此程序集将会加载到调用方的应用程序域中。
Load(string):用指定的名称加载程序集,比如Assembly.Load("PoemGame.Eventhandlers"),这里的名称不是文件名,是程序集的长格式或短格式。
Load(AssemblyName):使用程序集的名称加载程序集。

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

【中文标题】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 方法加载和检查具有相同标识但位于不同路径的程序集”

【讨论】:

以上是关于Assembly.Load的主要内容,如果未能解决你的问题,请参考以下文章