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

卸载appdomain后仍保留程序集

是指在.NET应用程序中,当一个应用程序域(AppDomain)被卸载后,其中加载的程序集仍然保留在内存中。

概念: 应用程序域(AppDomain)是.NET Framework提供的一种隔离机制,用于在一个进程中运行多个独立的应用程序。每个应用程序域都有自己的虚拟地址空间,并且可以加载和卸载程序集。

分类: 卸载appdomain后仍保留程序集属于.NET Framework的运行时特性。

优势:

  1. 节省内存:通过卸载不再需要的应用程序域,可以释放占用的内存资源,提高系统的整体性能。
  2. 隔离性:应用程序域提供了一种隔离机制,可以在同一个进程中运行多个独立的应用程序,各应用程序之间相互隔离,提高了系统的稳定性和安全性。

应用场景: 卸载appdomain后仍保留程序集的应用场景包括:

  1. 动态加载和卸载插件:通过创建独立的应用程序域,可以在运行时动态加载和卸载插件,实现系统的可扩展性和灵活性。
  2. 多租户应用程序:在多租户的应用程序中,可以为每个租户创建独立的应用程序域,实现租户之间的隔离和资源的有效管理。

推荐的腾讯云相关产品和产品介绍链接地址: 腾讯云提供了一系列与云计算相关的产品和服务,包括云服务器、云数据库、云存储等。以下是一些相关产品的介绍链接地址(请注意,这里只是举例,实际选择产品时需根据具体需求进行评估):

  1. 云服务器(CVM):提供弹性计算能力,满足不同规模和需求的应用场景。详情请参考:https://cloud.tencent.com/product/cvm
  2. 云数据库MySQL版(TencentDB for MySQL):提供高可用、可扩展的MySQL数据库服务。详情请参考:https://cloud.tencent.com/product/cdb_mysql
  3. 对象存储(COS):提供安全、稳定、低成本的云存储服务,适用于各种数据存储和应用场景。详情请参考:https://cloud.tencent.com/product/cos

请注意,以上链接仅供参考,具体选择产品时建议根据实际需求进行评估和比较。

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

相关·内容

.NET基础:应用程序AppDomain

这种隔离可以为应用程序域提供安全性、可靠性, 并且为卸载程序提供了可能。...在 .NET中应用程序AppDomain是CLR的运行单元,它可以加载应用程序Assembly、创建对象以及执行程序。...AppDomain是可以在运行时进行动态的创建和卸载的,正因如此,才为插件技术提供了基础(注:应用程序和类型是不能卸载的,只能卸载整个AppDomain)。...四、影像复制程序 创建、卸载AppDomain都有、创建新对象也可以了,但是如果想完成热升级,还有一点小麻烦,那就是一个程序被加载后会被锁定,这时候是无法对其进行修改的。...所以就需要打开 影像复制程序 功能,这样在卸载AppDomain,把需要升级的应用程序进行升级替换,然后再创建新的AppDomain即可了。

1.2K60

C# 代码占用的空间

Assembly.LoadFile(file.FullName); Console.ReadKey(); } 结果使用内存需要 8M 多,所以代码也是需要内存的,一旦加载了就不会从程序卸载...如果是加载程序,那么加载程序就需要很多的内存,即使卸载程序也没有用 static void Main(string[] args) { var...GC.Collect(); GC.WaitForFullGCComplete(); } private static AppDomain...otherAssemblyBytes); return app; } 上面的代码使用了 Load 就需要 20M的内存,在后面使用 Unload 之后实际上内存也没有减少,所以建议不要使用程序加载方式...欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://lindexi.gitee.io ),不得用于商业目的,基于本文修改的作品务必以相同的许可发布。

76310

什么叫应用程序域?(zhuan)

应用程序域为安全性、可靠性、版本控制以及卸载程序提供了隔离边界。应用程序域通常由运行库宿主创建, 运行库宿主负责在运行应用程序之前引导公共语言运行库。...程序的加载方式决定其实时 (JIT) 编译代码是否可以在进程中由多个应用程序域共享,以及该程序是否可以 从进程中卸载: 1:如果程序是以非特定于域的形式进行加载,则共享相同安全授权的所有应用程序域都可以共享相同的...但是,程序则永远不能从进程中卸载。 2:如果程序不是以非特定于域的形式进行加载,则它必须在加载的每个应用程序域中都是 JIT 编译的。...但是,通过卸载程序加载的所有应用程序域,可以从进程中卸载程序。...使用此方法以避免将包含创 建的类型的程序加载到调用程序. 4:Unload:执行域的正常关闭.只有应用程序域中正在运行的所有线程都已停止或域中不再有运行的线程之后,才卸载 该应用程序域。

33810

.NET Core 3.0 可回收程序加载上下文

一、前世今生 .NET诞生以来,程序的动态加载和卸载都是一个Hack的技术,之前的NetFx都是使用AppDomain的方式去加载程序,然而AppDomain并没有提供直接卸载一个程序的API,而是要卸载整个...AppDomain才能卸载包含在其中的所有程序。...然而卸载整个CurrentAppDomain会使程序不能工作。...可能有人另辟西经,创建别一个AppDomain来加载/卸载程序,但是由于程序之间是不能跨域访问的,也导致只能通过Remote Proxy的方式去访问,这样在类型创建和使用上带来了一定的难度也是类型的继承变得相当复杂...在使用过程中自定义AssemblyLoadContext可以内部管理其中的程序,并对整体Context进行Unload。使用AssemblyLoadContext也可以避免程序名称和版本的冲突。

1K30

《CLR via C#》笔记:第4部分 核心机制(3)

卸载AppDomain 监视AppDomain AppDomain FirstChance异常通知 宿主如何使用AppDimain 高级宿主控制 第二十三章 程序加载和反射 程序加载 使用反射构建动态可扩展应用程序...但指定卸载AppDomain中的程序不可以。 3、AppDomain可以单独维护。 4、AppDomain可以单独配置。...但因为是AppDomain中立程序内容会共享给所有AppDomain,因此里面的程序不能卸载,只能等待进程结束之后让Windows回收。...卸载AppDomain会导致CLR卸载AppDomain中的所有程序,还会释放AppDomain的 Loader堆。卸载AppDomain的办法是调用AppDomain的静态Unload方法。...3、当2中发现的所有线程都离开AppDomain,CLR遍历堆,为引用了“由已卸载AppDomain创建的对象”的每个代理对象都设置一个标志(flag)。

79810

C# .NET Core 3.1 中 AssemblyLoadContext 的基本使用(转载非原创)

写过一个动态加载和释放程序的案例,基本实现了自己“兔死狗烹”,不留痕迹的设想。...比如 2.2 的 API 与 3.1 就不一样(自己的体会,换了个版本就提示函数参数错误), preview版中 AssemblyLoadContext 卸载无法删除库文件,但是版本升级就好了(github...: 使用 AssemblyLoaderContext 加载和卸载的代码必须要单独放在一个方法,不可以写在 Main 方法中,否则加载的模块只有等待整个程序退出才能卸载 方法中应加上 [MethodImpl...TIPS 在 Visual Studio 中提供了“模块窗口”,可以及时查看加载了哪些程序,在 “调试” > “窗口” > “模块” 02.png 简单对比 AppDomain AppDomain...似乎是一个大而全的概念,包括了程序运行的方方面面:工作路径、引用搜索路径、配置文件、卷影复制 等,而 AssemblyLoadContext 只是一个加载程序的工具。

1.2K20

Linux:如何在脚本开发中实现程序在用户退出保持运行

在Linux环境下进行脚本开发时,常常需要自主管理进程,确保某些关键程序在用户退出仍能继续运行,而不依赖于systemd这样的进程管理工具。本文将探讨如何通过其他方法实现这一目标。...使用nohup命令 nohup命令可以将程序置于后台运行,并在用户退出后继续运行。它会忽略所有的SIGHUP信号,从而防止程序因用户注销而终止。 sh nohup ..../my_script.sh & disown 使用setsid命令 setsid命令可以创建一个新的会话并将程序置于该会话中,确保程序与当前终端脱离关系。 sh setsid ....示例:使用tmux运行程序并分离会话 sh tmux new-session -d -s my_session '....示例:使用screen运行程序并分离会话 sh screen -dmS my_session .

26910

c#动态加载卸载DLL的方法

大家好,又见面了,我是全栈君 这篇文章介绍了c#动态加载卸载DLL的方法,有需要的朋友可以参考一下 c#中通过反射可以方便的动态加载dll程序,但是如果你需要对dll进行更新,却发现.net类库没有提供卸载...dll程序的方法。...在.net 中,加入了应用程序域的概念,应用程序域是可以卸载的。...也就是说,如果需要对动态加载的dll程序进行更新,可以通过以下方法解决: 新建一个应用程序域,在该应用程序域中动态加载DLL,然后可以卸载掉该应用程序域。...该应用程序域被卸载的时候,相关资源也会被回收。 要想这样实现,就要让你程序的currentDomain和新建的newDomain之间进行通信,穿过应用程序域的边界。

1.1K30

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

如果两个AppDomain需要使用一个类型,必须为每个AppDomain分别初始化和分配一次类型。必须为各个用到类型的AppDomain分别加载和初始化一次类型的方法和程序。...对于应用AppDomain的资源被加载,一直在内存中,卸载AppDomain资源是唯一卸载模块或者程序的途径,卸载AppDomain资源也是回收类型静态字段所占内存的唯一方式。      ...当给定的硬线程进入AppDomain,就会得到同样的软线程对象。    ...,可以使用一系列技术强制它加载和执行代码,可以采用ExecuteAssembly方法。...该方法将目标AppDomain加载到程序集中,并且执行其主入口点。在父AppDomain种,ExecuteAssembly方法不会加载或者初始化指定的程序

99550

多线程中的锁系统(一)-基础用法

A: CLR启动时,会创建 系统域(System Domain)和共享域(Shared Domain), 默认程序域(Default AppDomain)。 系统域和共享域是单例的。...程序域可以有多个,例子中我们使用AppDomain.CreateDomain方法创建的。 B:  按正常来说,每个程序域的代码都是隔离,互不影响的。...聪明的CLR会把一些基本类型Object, ValueType, Array, Enum, String, and Delegate等所在的程序MSCorLib.dll,在CLR启动过程中都会加载到共享域...Loader heap保存类型系统,如MethodTable,数据结构等,Loader heap生命周期不受GC管理,跟程序卸载有关。      ...所以共享域中Loader heap MSCorLib.dll中的int实例会一直保留着,直到进程结束。单个程序卸载也不受影响。作用域很大有没有!!!      这时第二个例子也很容易理解了。

59650

.Net Remoting(应用程序域) - Part.1

如果只有一个类库程序(.dll文件),是无法启动一个进程的(它并非可执行文件)。所以,创建进程需要加载一个可执行程序(Windows 窗体、控制台应用程序等.exe文件)。...当可执行程序加载完毕,.Net会在当前进程中创建一个新的应用程序域,称为 默认应用程序域。一个进程中只会创建一个默认应用程序域,这个应用程序域的名称与程序名称相同。...默认应用程序域不能被卸载,并且与其所在的进程同生共灭。 那么应用程序域是如何提供托管环境的呢?简单来说,应用程序域只是允许它所加载的程序访问由.Net Runtime所提供的服务。...在一个进程中可以包含多个应用程序域,一个应用程序域中可以包含多个程序。...应用程序域的基本操作 在.Net 中,将应用程序域封装为了AppDomain类,这个类提供了应用程序域的各种操作,包含 加载程序、创建对象、创建应用程序域 等。

59920

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

一般情况下,一个 .NET 程序加载到程序中以后,它的类型信息以及原生代码等数据会一直保留在内存中,.NET 运行时无法回收它们,如果我们要实现插件热加载 (例如 Razor 或 Aspx 模版的热更新...因为 .NET Core 不像 .NET Framework 一样支持动态创建与卸载 AppDomain,所以一直都没有好的方法实现插件热加载,好消息是,.NET Core 从 3.0 开始支持了可回收程序...(Collectible Assembly),我们可以创建一个可回收的 AssemblyLoadContext,用它来加载与卸载程序。...,然后调用 AssemblyLoadContext.Unload 允许 .NET Core 运行时卸载这个上下文加载的程序程序的数据会在 GC 检测到所有类型的实例都被回收回收 (参考文章开头的链接...首先它需要删除原有的 DLL 文件,因为卸载程序有延迟,原有的 DLL 文件在 Windows 系统上很可能会删除失败并提示正在使用,所以需要先重命名并在下次删除。

4.7K30

【A】兼容Core3.0 Natasha 的隔离域与热编译操作。

下面简单谈一谈: .NET Framework 开荒时期有 AppDomain 域之隔离术,包括有创建、加载程序卸载等方法,囊括百家程序,一刀以斩之。...对于前辈们来说谈到 AppDomain 可以口若悬河滔滔不绝,可惜我进入 C# 时间比较晚,对 AppDomain 的印象并不是很深,在应用上也没有什么造诣,仅此泛泛而言。...时间进入了 .NETCore 时代,AppDomain 在升级大潮中受到了致命打击, Create 方法和 Unload 方法经岁月升级的源码中充斥着 throw 和 throw ,完全丧失了功能,取而代之的是...这两幅图说展示了 Natasha 中自定义编译域的结构,如果在创建程序时不指定名字,程序名将以 GUID 形式创建,故名随机程序。...asm.CreateFastMethod(name=null); asm.CreateFakeMethod(name=null); //使用程序进行编译并获得程序 var assembly

67410

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

一个 AppDomain 中可以存在多个 Assembly,一个进程中可以存在多个 AppDomainAppDomain 旨在在执行程序之间提供与通常为进程提供的相同级别的隔离。...在通过 CLR 加载程序,原始引用将从内存中删除以阻止内存扫描器。程序被加载到一个新的应用程序域中,以允许在一次性 AppDomains 中运行程序。...通过在其自己的 AppDomain 中运行有效负载,这允许开发在一次性 AppDomain 中运行利用模块的工具。可以卸载应用程序域,但不能卸载单个程序。...因此,要在完成卸载程序,您必须将其放入自己的 AppDomain卸载它。...AC# 代理可以在其服务器上生成 shellcode,将结果注入到自己的新线程中,等待程序完成执行,然后卸载主机 AppDomain。您还可以修改 shellcode 本身来执行该角色。

1.9K00

.NET 的程序加载上下文

AppDomain 生效,直接设置当前 AppDomain 中这两个属性的值并不会产生任何效果。...以下意外的行为列表照抄自文档 Best Practices for Assembly Loading: 如果已加载一个具有相同标识的程序,则即使指定了不同的路径,LoadFrom 返回已加载的程序...从字节数组加载的程序都是在没有上下文的情况下加载的,除非程序的标识(在应用策略建立)与全局程序缓存中的程序标识匹配;在此情况下,将会从全局程序缓存加载程序。...在没有上下文的情况下加载程序具有以下缺点,以下摘抄自 Best Practices for Assembly Loading: 无法将其他程序绑定到在没有上下文的情况下加载的程序,除非处理 AppDomain.AssemblyResolve...欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改的作品务必以相同的许可发布。

28730
领券