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