首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么AssemblyResolve事件要尝试解析已加载到AppDomain中的程序集?

AssemblyResolve事件是.NET Framework提供的一个事件,用于在程序运行过程中解析程序集的引用关系。当程序需要加载一个程序集时,它会首先查找已加载到AppDomain中的程序集,如果找不到,则会触发AssemblyResolve事件,尝试解析已加载到AppDomain中的程序集。

这个事件的存在有以下几个原因:

  1. 动态加载程序集:在某些情况下,程序需要在运行时动态加载程序集,而不是在编译时静态引用。例如,插件式架构中的插件可以在运行时被加载,这样可以实现灵活的扩展性和可插拔性。通过尝试解析已加载到AppDomain中的程序集,可以避免重复加载已经存在的程序集,提高加载效率。
  2. 解决程序集版本冲突:在一个复杂的应用程序中,可能会存在多个程序集引用了同一个程序集的不同版本。当程序需要加载一个特定版本的程序集时,如果已加载到AppDomain中的程序集版本不匹配,就会触发AssemblyResolve事件,尝试解析已加载的程序集,以满足版本要求。
  3. 自定义程序集加载逻辑:通过订阅AssemblyResolve事件,可以自定义程序集加载逻辑。例如,可以在事件处理程序中根据程序集名称、路径等信息,动态加载程序集。这样可以实现更加灵活和个性化的程序集加载策略。

总结起来,AssemblyResolve事件的目的是为了解决程序集加载的灵活性和可扩展性问题,通过尝试解析已加载到AppDomain中的程序集,可以避免重复加载、解决版本冲突,并且可以实现自定义的程序集加载逻辑。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CLR查找和加载程序方式(一)

,如果dll查找不到,则会尝试查找同名exe 如果程序带有区域性,而不是语言中立,则还会尝试查找以语言区域命名子目录 强名称签名程序 全局程序缓存 如果有定义codebase,则以codebase...定义为准,如果 codebase指定路径找不到,则直接报告错误 程序根目录 根目录下面,与被引用程序同名子目录 根目录下面被明确定义为私有目录子目录 在目录查找时候,如果dll查找不到,则会尝试查找同名...exe 如果程序带有区域性,而不是语言中立,则还会尝试查找以语言区域命名子目录 ?...方法二:订阅程序解析事件 AssemblyResolve 在代码解析 应用程序域中支持在程序解析处理: AppDomain.CurrentDomain.AssemblyResolve +=...CurrentDomain_AssemblyResolve; 通过这个事件,我们可以在程序解析时,根据不同程序做不用处理,比如加载x86程序还是64位程序,当然也就可以指定程序目录了,

1.7K30

.NET 程序加载上下文

默认加载上下文 在全局程序缓存中发现类型会加载到默认加载上下文中 位于应用程序探测路径程序集会加载到默认加载上下文中,这包括了 ApplicationBase 和 PrivateBinPath...以下意外行为列表照抄自文档 Best Practices for Assembly Loading: 如果加载一个具有相同标识程序,则即使指定了不同路径,LoadFrom 仍返回加载程序...如果用 LoadFrom 加载一个程序,随后默认加载上下文中一个程序尝试按显示名称加载同一程序,则加载尝试将失败。 对程序进行反序列化时,可能发生这种情况。...在没有上下文情况下加载程序具有以下缺点,以下摘抄自 Best Practices for Assembly Loading: 无法将其他程序绑定到在没有上下文情况下加载程序,除非处理 AppDomain.AssemblyResolve...可以在没有上下文情况下预加载依赖项、将依赖项预加载到默认加载上下文中或通过处理 AppDomain.AssemblyResolve 事件来加载依赖项。

25430

C#将引用dll嵌入到exe文件

当发布程序有引用其它dll, 又只想发布一个exe时就需要把dll打包到exe 当然有多种方法可以打包, 比如微软ILMerge,混淆器附带打包......方法如下: 1.项目下新建文件夹dll 2.把打包dll文件放在dll文件夹下,并包括在项目中 3.右键文件属性, 生成操作选择嵌入资源 4.实现如下代码, 在窗口构造实现也可以(在窗体事件无效.../// [STAThread] static void Main() { AppDomain.CurrentDomain.AssemblyResolve...return Assembly.Load(assemblyData); } } } } 实现原理: 把dll嵌入到exe程序资源..., 并实现程序加载失败事件(当在程序目录和系统目录下找不到程序触发), 当找不到程序时就从资源文件加载, 先转换为字节数组再转换到程序返回给程序, 这样dll就被加载到程序中了.

3.6K20

使Spring.NETIOC容器支持动态加载程序

当然,我们还需要一个FileSystemWatcher来监控程序目录,当目录程序发生变化时,再把新程序复制到新临时目录,然后再加载新临时目录程序文件。...也就是便利AppDomain.CurrentDomain中所有加载程序,对每个程序都调用一次Assembly.GetType方法,看看哪个程序可以成功返回类型。...还要很多情况下会触发这个事件),那我们是否可以通过AppDomain.AssemblyResolve事件来返回我们需要程序呢?...通过试验,这种方式也是不可以,因为一旦Assembly.LoadWithPartialName利用AppDomain.AssemblyResolve事件得到了程序之后,第二次再调用这个方法时,就不会再去触发...AppDomain.AssemblyResolve事件了,因为.net framework认为这个程序它是可以识别的,不需要再触发这个事件了。

66940

Excel催化剂开源第6波-Clickonce部署之自动升级瘦身之术

资源文件问题还比较好解决,只要不把资源文件内嵌到程序集中,然后通过手动下载或程序代码自动检测有新增或更新就下载到用户机器上(Excel催化剂原来是采用代码在程序运行时比较再自动化下载,无奈部署是外网服务器...True 强类型为false时示例 强类型为true时,在属性这里将复制本地改为false,发布时就不会复制到程序文件夹 强类型为true时示例 可以来看最终release文件夹文件 已经分离了大部分引用...,在程序开始时订阅一下这个事件,大概意思是程序要使用某个功能时,找不到相应引用dll,会激发这个事件,在这个事件里告诉程序应该下一步怎么办,继续找的话从哪里找就在这个事件方法写上。...方法第1个dll文本是我文件夹,assemblyName 是不含文件后缀,所以补上后面的是“.dll” AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve...ClickOnce自动升级真的好用,让开发者聚焦在业务代码实现,使用其现有的框架堆代码即可实现自动更新,非常值得尝试使用。

38910

VsxHowTo -- 把Windows Forms Designer作为自己编辑器(3)

我们在PackageInitialize方法来注册这两个事件: protected override void Initialize(){ Trace.WriteLine(string.Format...tbService.AddToolboxItem(tool, category); } tbService.Refresh();} OnRefreshToolbox方法负责读取当前程序里所有附有...不知道为什么,我们Package程序如果不在gac里的话,vs实验室不能加载MyRootControlDesigner,调试时候明明已经看到CurrentDomain里已经有我们这个程序集了。...不过没关系,我们可以给CurrentDomain注册一个AssemblyResolve事件处理程序,这样vs就能加载我们RootDesigner了: public sealed class WinFormDesignerPackage...//解决无法加载MyRootControl设计器问题 AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve

73310

CLR程序加载

JIT编译器将该标识匹配一个程序载到AppDomain。】      CLR内部加载程序提供了4方法,在System.Refleetion.Assembly类:     1.    ...采用静态方法Load()加载程序,可调用它显示将一个程序载到AppDomain: 【注:Assembly类Load()存在两个重载版本】 /// /// 通过给定程序显示名称来加载程序...【注:System.AppDomain提供了一个Load方法,这与Assembly静态Load方法不同,AppDoaminLoad是一个实例方法,它允许将一个程序载到一个指定AppDoamin...3.采用AssemblyLoadFile方法,这个方法可以从任意路径加载一个程序,并可将具有相同标识一个程序多次加载到一个AppDoamin。...,CLR不会自动解析任何依赖性问题,代码必须向AppDomainAssemblyReaolve事件登记,并让事件回调方法显示加载依赖程序

96180

解析.NET对象跨应用程序域访问(上篇)

该方法将目标AppDomain载到程序集中,并且执行其主入口点。在父AppDomain种,ExecuteAssembly方法不会加载或者初始化指定程序。...该方法接收三个参数,assemblyFile:包含执行程序文件名称;assemblySecurity:为程序提供证据;args:程序入口点实参。该方法返回 程序入口点返回值。.../// LoadFile, /// /// 使用原始文件名将目标程序位加载到内存。...注意,如果一个程序被加载到内存而没有调试符号,那么          /// image将被抛出。 警惕这个。...使用LoadBits方法加载程序不会锁定          /// DLL文件,因为整个程序被加载到内存并且文件句柄被关闭。

95550

红队技巧之F#利用

这是一个用于显示.NET在不同编程语言间互通程序设计,可以被.NET任意其它代码编 译和调用。...至于为什么学习F#,其实也是跟C#道理是一样,在某些特殊情况下,我们可以利用F#来达到我们目的,原常景如下: This customer really locked down their environment...但这并不意味着我们便无法在内存运行我们F#程序,我们可以使用非托管代码方法来运行任意我们F#程序。...实现过程如下: 1.将CLR加载到进程:调用CLRCreateInstance函数以获取ICLRMetaHost或ICLRMetaHostPolicy接口,调用ICLRMetaHost方法来获取有效...^ currentDomain = System::AppDomain::CurrentDomain; currentDomain->AssemblyResolve += gcnew System

1.4K30

Donut - 将 .NET 程序作为 Shellcode 注入

.NET程序:.NET 应用程序被打包成 .NET 程序。之所以这样称呼它们,是因为您选择语言中代码“组装”到 CIL ,但并未真正编译。...在通过 CLR 加载程序后,原始引用将从内存删除以阻止内存扫描器。程序被加载到一个新应用程序域中,以允许在一次性 AppDomains 运行程序。...无论哪种方式,它都会加载到 AppDomain 。在程序加载之后但在它运行之前,解密副本将被释放,然后使用 VirtualFree 从内存释放以阻止内存扫描器。...最后, 如果 CLR 已经加载到宿主进程,那么 donut shellcode 仍然可以工作。.NET 程序将被加载到托管进程内新应用程序域中。....一次性应用程序域 当 donut 加载一个程序时,它会将它加载到一个新 AppDomain

1.7K00

Asp.net管道模型(管线模型)之一发不可收拾

AppDomain运行程序。...从运行程序过程是这样:系统首先分配一段内存地址空间然后把控制权交给了CLR生成默认AppDomain,然后将程序载到默认AppDomain程序正式运行(系统在托管堆没有AppDomain...AppDomain创建AppDomain并将该虚拟目录程序载到AppDomain(虚拟目录可能不止一个程序,而默认AppDomain会将整个虚拟目录下所有程序载到AppDomain上)...,如果该虚拟目录AppDomain存在就直接使用该AppDomain,如果虚拟目录程序发生变化(包括web.config变化),就会新建一个AppDomain再将以变化程序载到AppDomain...Session状态变量有三种模式InProc、StateServer和SQLServer,其中默认为InProc表示Session状态保存在Asp.net进程,如果虚拟目录程序发生变化后在新AppDomain

2.3K90

使用 .NET Core 3.0 AssemblyLoadContext 实现插件热加载

一般情况下,一个 .NET 程序载到程序以后,它类型信息以及原生代码等数据会一直保留在内存,.NET 运行时无法回收它们,如果我们实现插件热加载 (例如 Razor 或 Aspx 模版热更新...如果你用过 .NET Framework AppDomain 机制可能会想是否需要 Marshalling 处理,答案是不需要,.NET Core 可回收程序集会加载到当前 AppDomain...你可能会有疑问,为什么不在文件改变后立刻触发重新加载插件,一个原因是部分文件编辑器保存文件实现可能会导致改变事件连续触发几次,延迟触发可以避免编译多次,另一个原因是编译过程中出现异常可以传递到访问插件实例线程...接下来它会查找插件文件夹下所有 C# 源代码,用 CSharpSyntaxTree 解析它们,并用 CSharpCompilation 编译,编译时引用程序列表是构造函数取得默认 AssemblyLoadContext...程序列表 (包括宿主程序,这样插件代码才可以使用 IPlugin 接口)。

4.5K30

.NET基础:应用程序AppDomain

在 .NET应用程序AppDomain是CLR运行单元,它可以加载应用程序Assembly、创建对象以及执行程序。...如果默认AppDomain监听了 UnhandledException 事件,任何线程任何未处理异常都会引发该事件,无论线程是从哪个AppDomain开始。...如果说有关系的话,可以牵强认为一个Thread可以使用多个AppDomain对象,一个AppDomain可以使用多个Thread. 3、AppDomain vs 应用程序Assembly Assembly...Assembly不能单独执行,它必须被加载到AppDomain,然后由AppDomain创建程序集中类型 及 对象。...所以就需要打开 影像复制程序 功能,这样在卸载AppDomain后,把需要升级应用程序进行升级替换,然后再创建新AppDomain即可了。

1.1K60
领券