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

在C#中使用AppDomain动态加载和卸载dll

在C#中,使用AppDomain动态加载和卸载DLL是一种常见的技术,可以在运行时动态地添加或删除程序集。这种方法对于插件系统、模块化开发和测试等场景非常有用。

以下是一些关键概念和步骤:

  1. AppDomain:AppDomain是.NET框架中的一个概念,它是一个隔离边界,可以在其中加载和执行程序集。AppDomain允许您在同一个进程中运行多个独立的应用程序,每个应用程序都有自己的AppDomain。
  2. 动态加载DLL:使用AppDomain,您可以在运行时动态加载DLL文件。这可以通过反射来实现,即使您不知道DLL的具体类型和方法,也可以在运行时加载和调用它们。
  3. 卸载DLL:在AppDomain中加载的DLL可以在不影响整个应用程序的情况下卸载。这可以通过卸载整个AppDomain来实现,这样所有加载在该AppDomain中的程序集都会被卸载。

以下是一个简单的示例,演示如何在C#中使用AppDomain动态加载和卸载DLL:

代码语言:csharp
复制
using System;
using System.Reflection;

public class Program
{
    public static void Main()
    {
        // 创建一个新的AppDomain
        AppDomain domain = AppDomain.CreateDomain("MyDomain");

        // 在新的AppDomain中加载DLL
        domain.Load("MyAssembly");

        // 在新的AppDomain中执行方法
        object result = domain.ExecuteAssembly("MyAssembly", "MyAssembly.MyClass.MyMethod");

        // 卸载新的AppDomain
        AppDomain.Unload(domain);
    }
}

需要注意的是,卸载AppDomain会立即释放该AppDomain中的所有资源,包括已加载的程序集和正在运行的线程。因此,在卸载AppDomain之前,应确保已经处理了所有未完成的任务和资源。

推荐的腾讯云相关产品:

  • 腾讯云云函数:腾讯云云函数是一种事件驱动的、可无服务器扩展的计算服务,可以帮助您快速构建高可用、高可扩展的应用程序。
  • 腾讯云容器服务:腾讯云容器服务是一种弹性、可扩展的容器解决方案,可以帮助您快速构建、部署和管理容器化应用程序。
  • 腾讯云API网关:腾讯云API网关是一种高性能、可扩展的API管理服务,可以帮助您快速构建、部署和管理API。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

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

97930

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

卸载AppDomain 监视AppDomain AppDomain FirstChance异常通知 宿主如何使用AppDimain 高级宿主控制 第二十三章 程序集加载反射 程序集加载 使用反射构建动态可扩展应用程序...反射的性能 设计支持加载项的应用程序 使用反射发现类型的成员 第二十二章 CLR寄宿AppDomain Framework的巨大价值。... Windows中将第三方DLL加载到进程中意味着冒险。DLL的代码很容易破坏应用程序的数据结构代码。DLL还可能企图利用应用程序的安全上下文来访问它本来无权访问的资源。...程序员经常将寄宿AppDomain与程序集的加载反射一起使用。 CLR寄宿 .NET Framework Windows平台的顶部运行。...CLRCreateInstance 函数 MSCorEE.dll 文件实现,该文件一般C:\Windows\System32目录

75010

ASP.NET MVC模块化开发——动态挂载外部项目

一般动态加载dll的方法是使用Assembly.LoadFIle的方法来调用,但是会存在如下问题: 1.如果MVC项目中存在依赖注入,框架层面无法将外部dll的类放入IOC容器 通过 BuildManager.AddReferencedAssembly...方法MVC项目启动前,动态将外部代码添加到项目的编译体系,需要配合PreApplicationStartMethod注解使用,示例: 声明一个类,然后进行注解标记,指定MVC启动前方法 //使用PreApplicationStartMethod...dll后如果要更新业务代码,dll会被锁定,无法替换,需要重启应用 解决办法是通过AppDomain对业务项目dll独立加载,更新时进行卸载 1)创建一个RemoteLoader一个可穿越边界的类,作为加载...cshtml加入到框架,我们还需要将业务工程View模块的页面挂载虚拟目录到框架,如图所示 5.框架启动后,更新业务dll带来的相关问题 启动的项目中我们更新dll,我们希望达到的效果是更新框架...bin目录文件的dll一样,程序会重启,这样就会再次调用被PreApplicationStartMethod注解标注的方法,不需要在代码做额外处理判断是首次加载还是更新加载,同时也做不到动态的将外部dll

24930

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

下面简单谈一谈: .NET Framework 开荒时期有 AppDomain 域之隔离术,包括有创建、加载程序集、卸载等方法,囊括百家程序集,一刀以斩之。...对于前辈们来说谈到 AppDomain 可以口若悬河滔滔不绝,可惜我进入 C# 时间比较晚,对 AppDomain 的印象并不是很深,应用上也没有什么造诣,仅此泛泛而言。...时间进入了 .NETCore 时代,AppDomain 升级大潮受到了致命打击, Create 方法 Unload 方法经岁月升级后的源码充斥着 throw throw ,完全丧失了功能,取而代之的是...5、插件加载要注意与插件 dll 同目录的依赖文件,3.0 提供了 AssemblyDependencyResolver 操作类自动解析依赖,建议使用带有.deps.json文件的完整插件。...对于无法卸载的情况,官方建议使用 windbg sos 组件进行调试,新版 sos 将独立出来,各位可以使用以下命令进行安装(建议开源工作者封装此功能时添加UT测试检测卸载功能,尽可能保证正常的情况下不需要用户自己去调试

65610

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

写过一个动态加载释放程序的案例,基本实现了自己“兔死狗烹”,不留痕迹的设想。...无奈最新的 .NET Core 3.1 ,已经不支持创建新的 AppDomain 了(据说是因为跨平台实现太重了),改为使用 AssemblyLoadContext 了。...上的一篇讨论) 本文主要是关于 AssemblyLoadContext 的基本使用加载释放类库。...基本使用 程序的基本功能是:动态加载 Magick 的所需库,并调用其压缩图片的函数压缩给定图片。...,创建实例加载即可;卸载时需要注意的是一下几点: 使用 AssemblyLoaderContext 加载卸载的代码必须要单独放在一个方法,不可以写在 Main 方法,否则加载的模块只有等待整个程序退出后才能卸载

1K20

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

以往,我们可以使用 .NET Framework 的 AppDomain 机制,或者使用解释器 (有一定的性能损失),或者在编译一定次数以后重启程序 (Asp.NET 的 numRecompilesBeforeAppRestart...因为 .NET Core 不像 .NET Framework 一样支持动态创建与卸载 AppDomain,所以一直都没有好的方法实现插件热加载,好消息是,.NET Core 从 3.0 开始支持了可回收程序集...Unload(); _context = null; } 这个方法会卸载加载的插件,首先调用 IPlugin.Dispose 通知插件正在卸载,如果插件创建了新的线程可以 Dispose 方法停止线程避免泄漏...首先它需要删除原有的 DLL 文件,因为卸载程序集有延迟,原有的 DLL 文件 Windows 系统上很可能会删除失败并提示正在使用,所以需要先重命名并在下次删除。...编译成功后会使用自定义的 AssemblyLoadContext 加载编译后的 DLL 以支持卸载

4.5K30

ILRuntime热更新

lib,dll,pdb文件:传送门。dll动态链接库,pdb程序数据二进制文件,pdb文件保存着调试项 目状态信息,主要作用是调试。...---- Examples部分 01.HelloWorld 加载dll并在逻辑后处理进行简单调用 整个文件流程:创建IEnumerator并运行->用文件流判断并读入dllpdb->尝试加载程序集dll...->(如果加载成功)初始化脚本引擎(InitializeILRuntime())->执行脚本引擎加载后的逻辑处理(OnHotFixLoaded())->程序销毁(OnDestoy关闭dllpdb的文件流...使用默认无参数构造函数创建实例,可以使用Write方法写入,随着字节数据的写入,数组的大小自动调整。 参考博客:传送门 appdomain.LoadAssembly:将需要热更的dll加载到解释器。...使用MonoBehaviour->不建议) 09.Reflection(主工程反射DLL类型) 热更DLL使用反射跟原生C#没有区别 Demo主要介绍主工程反射热更DLL的类型 void OnHotFixLoaded

2.2K30

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

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

99830

.NET基础:应用程序域AppDomain

例如,Windows 使用进程来隔离应用程序。 为确保一个应用程序运行的代码不会对其他不相关的应用程序产生不良影响,这种隔离是必需的。... .NET应用程序域AppDomain是CLR的运行单元,它可以加载应用程序集Assembly、创建对象以及执行程序。...AppDomain是可以在运行时进行动态的创建和卸载的,正因如此,才为插件技术提供了基础(注:应用程序集类型是不能卸载的,只能卸载整个AppDomain)。...二、创建 卸载AppDomain 前文已经说明了,我们可以在运行时动态的创建和卸载AppDomain, 有这样的理论基础、我们就可以热升级应用程序了 。..."; // 虽然此方法已经被标记为过时方法, msdn备注也提倡不使用该方法, // 但是 以.net 4.0 + win10环境测试,还必须调用该方法 否则,即便卸载了应用程序域 dll 还是未被解除锁定

1.1K60

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

程序域可以有多个,例子我们使用AppDomain.CreateDomain方法创建的。 B:  按正常来说,每个程序域的代码都是隔离,互不影响的。...聪明的CLR会把一些基本类型Object, ValueType, Array, Enum, String, and Delegate等所在的程序集MSCorLib.dllCLR启动过程中都会加载到共享域...所以共享域中Loader heap MSCorLib.dll的int实例会一直保留着,直到进程结束。单个程序域卸载也不受影响。作用域很大有没有!!!      这时第二个例子也很容易理解了。...也知道stringc#是个特殊对象,值是不变的,每次变动都是一个新对象值,这也是推荐stringbuilder原因。...当释放后需要重新转换成托管代码,性能会有一定的损耗,所以尽量需要跨进程的场景再使用

58350

dotnet core 应用是如何跑起来的 通过自己写一个 dotnet host 理解运行过程

包括如何寻找 dotnet 运行时,如何加载运行时框架然后跑起来业务端的 dll 文件的逻辑 在上一篇博客告诉大家 dotnet 的 AppHost 是如何做的,详细请看 dotnet core 应用是如何跑起来的...如果看到只是一闪而过,还请在适当地方添加断点哈,因为 C++ 程序 VS 上没有做 C# 一样的优化,执行完成之后不退出控制台 如果能运行成功,可以看到如下界面 ?...加载程序集需要加载到一个 AppDomain 上,如果大家玩过插件开发,这部分将会更好的理解。...| ... ; // 以下逻辑用 C++ 写,需要太多代码了,因此我就换 C# 系的代码来写 // 哪些 dll 或 exe 将会被加入寻找程序集加载路径...dotnet 的 Host 加载自己定义的运行时框架文件夹,以及自己创建第一个 AppDomain 加载程序集 另外上面代码的另一个功能是让 Native 的其他语言编写的应用,可以加载使用 dotnet

48510

Centosyum安装卸载软件的使用方法

Centosyum安装卸载软件的使用方法 安装方法 安装一个软件时 yum -y install httpd 安装多个相类似的软件时 yum -y install httpd* 安装多个非类似软件时...yum -y install httpd php php-gd mysql 卸载一个软件时 yum -y remove httpd 卸载多个相类似的软件时 yum -y remove httpd* 卸载多个非类似软件时...mysql 另外还有一个非常棒的用法 假如我要执行iostat这个命令来查看CPU与存储设备状态,可是执行却发现没有这个命令 于是执行yum install iostat,结果说找不到该软件,使用下面的办法可以解决...yum search iostat就能查到iostat相关的安装包了, 另外想安装一个程序,只记得一部分名称,也可以用这个办法来实现安装 yum search png |grep png 就能找到我们想安装的

1.6K30

Centosyum安装卸载软件的使用方法

yum -y remove httpd 卸载多个相类似的软件时 yum -y remove httpd* 卸载多个非类似软件时 yum -y remove httpd php php-gd mysql...假如我要执行iostat这个命令来查看CPU与存储设备状态,可是执行却发现没有这个命令 于是执行yum install iostat,结果说找不到该软件,使用下面的办法可以解决 yum search...iostat 就能查到iostat相关的安装包了, 另外想安装一个程序,只记得一部分名称,也可以用这个办法来实现安装 yum search png |grep png 就能找到我们想安装的libpng...这个名称 Linux系统下yum命令查看安装了哪些软件包: $yum list installed //列出所有已安装的软件包 yum针对软件包操作常用命令: 1.使用YUM查找软件包...list installed 5.列出所有已安装但不在 Yum Repository 内的软件包 命令:yum list extras 6.列出所指定的软件包 命令:yum list 7.使用

97810

如何使用FrostByte构建出更好的红队Payload

在这个PoC项目中,我们利用了Sigflip的加载程序代码构建AppDomain DLL,并使用Sigflip注入器将加密的shellcode嵌入到我们的C#程序。...这样做可以降低DLL的静态检测率,同时shellcode也可以更好地存储在有符号的二进制文件。  ...该项目以AppDomain管理器注入为例,但这种思想也适用于其他注入技术,如DLL加载DLL劫持等。  ...  构建签名shellcode可执行程序 1、选择一个x64已签名的C#代码,这个代码类似于Cobalt Strike的Beacon,是你想要注入执行的代码,比如说CasPol.exe之类的; 2、生成...的帮助下,我们将获取到一个名为update.exe的已签名代码,这个程序是一个嵌入了加密shellcode的PE文件; 构建AppDomain加载DLL 1、点击【链接】获取C#模版代码; https

58310

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

如果两个AppDomain需要使用一个类型,必须为每个AppDomain分别初始化分配一次类型。必须为各个用到类型的AppDomain分别加载初始化一次类型的方法程序集。...对于应用AppDomain的资源被加载,一直在内存卸载AppDomain资源是唯一卸载模块或者程序集的途径,卸载AppDomain资源也是回收类型静态字段所占内存的唯一方式。      ...在上面提到过操作系统的线程与AppDomain类似,CLR定义了System.Threading.Thread,AppDomain中表示为可调度的实体,在这里提出一个新的概念,那就是“软线程”“...(4).ExecuteAssembly():使用指定的证据实参执行指定文件包含的程序集。...使用LoadBits方法加载程序集不会锁定          /// DLL文件,因为整个程序集被加载到内存并且文件句柄被关闭。

94950

使Spring.NET的IOC容器支持动态加载的程序集

,并不支持从动态加载的程序集中创建对象,如果直接把更新后的程序集复制到bin目录,会无法替换dll或导致应用程序重启。...动态加载程序集,网上最多的说法是另外创建一个AppDomain,然后新创建的AppDomain加载程序集。...动态加载程序集的目的,就是为了可以不关闭应用程序的情况下替换dll,如果我直接Assembly.LoadFile肯定是不行的,因为我一旦Load了这个File,这个文件就被使用了,没法替换。...当然,已经加载的程序集AppDomain.CurrentDomain没有被销毁前,是不能卸载的,所以经过几次程序集的更新后,我们的AppDomain.CurrentDomain中就会存在几个不同版本的程序集...实际使用时,我们大多都会使用第一种格式的类型字符串,即“TypeName,AssemblyName”的形式,所以它会走到第1情况

66640
领券