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

将DLL加载到单独的AppDomain中

将DLL加载到单独的AppDomain中可以实现在.NET应用程序中动态加载和卸载DLL,而不会影响到其他模块的运行。这种方法可以用于插件化开发、模块化开发等场景。

以下是一个简单的示例代码:

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

public class Program
{
    static void Main(string[] args)
    {
        AppDomain domain = AppDomain.CreateDomain("MyDomain");
        domain.AssemblyResolve += Domain_AssemblyResolve;
        domain.DoCallBack(LoadAssembly);
        AppDomain.Unload(domain);
    }

    private static void LoadAssembly()
    {
        string assemblyPath = @"C:\MyAssembly.dll";
        Assembly assembly = Assembly.LoadFrom(assemblyPath);
        Type type = assembly.GetType("MyNamespace.MyClass");
        object obj = Activator.CreateInstance(type);
        type.GetMethod("MyMethod").Invoke(obj, null);
    }

    private static Assembly Domain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        string assemblyPath = @"C:\MyAssembly.dll";
        return Assembly.LoadFrom(assemblyPath);
    }
}

在上面的示例代码中,我们首先创建了一个新的AppDomain,并为其指定了一个名称。然后,我们通过监听AssemblyResolve事件来加载所需的DLL。在LoadAssembly方法中,我们加载了DLL并实例化了一个类,然后调用了该类的方法。最后,我们卸载了AppDomain。

需要注意的是,由于每个AppDomain都有自己的程序集加载上下文,因此在加载DLL时需要注意避免重复加载同一个程序集。此外,由于每个AppDomain都是独立的,因此在加载DLL时需要注意线程安全和资源管理。

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

相关·内容

WordPress文章外链图片自动下载到本地

WordPress很多插件或者代码都可以实现在编辑文章自动外链图片下载到本地,最终我选择了一个叫:Easy Copy Paste插件。...' => 'inherit' ); } add_action('save_post', 'ecp_save_post', 120, 2); 单篇操作 之后,编辑文章只需要点击更新按钮,就可以文章外链图片下载到本地并替换链接...不过逐个编辑文章不仅繁琐而且工作量不小,这里教大家一个小技巧,可以批量下载文章外链图片。...批量操作 该插件代码不仅可以在正常编辑页面点击更新按钮触发下载功能,而且可以在后台所有文章列表页面触发下载图片功能,原理明白了,操作就简单了。...切记,不要更改批量编辑任何设置,只需单击 “更新”即可。 这个过程触发检查所有选定文章,并自动下载外链图片! 声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。

31550

用PHP图片以流形式加载到image标签

很多情况下,如果为了网站资源案例考虑,我们就不能直接暴露资源地址到页面中去,以防被人用工具去扫描盗用资源文件下文件,在这里我们就可以考虑以前端页面请求后端程序,后端程序加以验证之后,以流方式资源输出...,其它地方直接复制修改参数用)     /*      * 获取文件流      * */     public function getFileStream(){         //接收前端传过来ID...get.id');         if(empty($id)){             echo '';              exit();         }         //在这里可以加入自己逻辑与业务处理程序...以防资源浪费          fclose($fp);         //输出文件流         echo $picturedata;         exit();     } 2、html...id=1" alt="" /> 3、最终效果

1.6K10

C#引用dll嵌入到exe文件

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

3.6K20

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

如上图所示,一个对象正好存放在一个AppDomain种,值也一样。一个AppDomain对象引用必须是引用同一AppDomain对象,AppDomain行为就好像拥有自己私有的地址空间。...该方法目标AppDomain载到程序集中,并且执行其主入口点。在父AppDomain种,ExecuteAssembly方法不会加载或者初始化指定程序集。...尽管它对DLL地狱倾向,这可能是去方式          /// default,只要确保应用程序基本目录传递给AssemblyResolver实例等         ...这也允许同时加载同名多个程序集          ///维护单独文件名。 这是推荐方式。...使用LoadBits方法加载程序集不会锁定          /// DLL文件,因为整个程序集被加载到内存并且文件句柄被关闭。

95450

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

(很推荐放在竖屏上阅读本电子书,这多是一件美事) 欢迎群学习交流:637959304 进群密码:(CSGO拆包密码)  ---- 目录 第二十二章 CLR寄宿和AppDomain CLR寄宿 AppDomain...允许可扩展性意味着第三方代码可在你进程运行。在 Windows中将第三方DLL载到进程中意味着冒险。DLL代码很容易破坏应用程序数据结构和代码。...但指定卸载AppDomain程序集不可以。 3、AppDomain可以单独维护。 4、AppDomain可以单独配置。...然后,CLR查找栈上在同一个AppDomain任何 catch 块。有一个catch 块能处理异常,则异常处理完成,继续正常执行。...(P515 1) 程序集加载 JIT编译器方法代码编译成本机代码时,会查看L代码引用了哪些类型。

75410

.NET 程序集加载上下文

AppDomain 生效,直接设置当前 AppDomain 这两个属性值并不会产生任何效果。...程序集加载到默认加载上下文中时,会自动加载其依赖项。 使用默认加载上下文时,加载到其他上下文中依赖项将不可用,并且不能将位于探测路径外部位置程序集加载到默认加载上下文中。...可以在没有上下文情况下预加载依赖项、依赖项预加载到默认加载上下文中或通过处理 AppDomain.AssemblyResolve 事件来加载依赖项。...在没有上下文情况下加载具有同一标识多个程序集会导致出现类型标识问题,这些问题与具有同一标识多个程序集加载到多个上下文中所导致问题类似。 请参阅避免一个程序集加载到多个上下文中。...使用被遗弃 API(不推荐) AppDomain 有一个已经被遗弃 API AppendPrivatePath,可以一个路径加入到探测路径列表

24930

关于CLR内存管理一些深层次讨论

从与程序集关系来讲,我们可以应用程序域看成是加载程序集容器。只有相关程序集被CLR加载到相应应用程序域中,才谈得上代码执行。 基于应用程序域隔离,归根结底是内存隔离。...在该程序域初始化过程,由它将msCorLib.dll这个程序集(这是一个很重要程序集,.NET类型系统最基本类型定义其中)加载到共享程序域中。此外,驻留字符串也被保存在此系统程序域中。...为了让大家能够确定相应操作是在哪个应用程序域中执行,在枷锁和检查锁定时候应用程序域名称(AppDomain.FriendlyName属性)打印出来。...在默认情况下,程序集被加载到当前程序域中,供该程序集独占使用。我个人这两种不同程序集加载方式称为:独占加载(Exclusive Loading )和共享加载(Shared Loading)。...如右图所示:如果某个类型被定义在程序集中Foo.Dll,当AppDomain1和AppDomain2需要使用该类型时候,它们会分别以独占方式加载程序集Foo.Dll

63490

浏览器嵌入 .NET 应用程序:DotNetBrowser 还是 CefSharp?

Office VSTO 加载项加载到单独 AppDomain [6]以进行隔离。 DotNetBrowser 在非默认 AppDomain 运行。...在 DotNetBrowser ,所有必需 Chromium 二进制文件和 DLL 都已打包到 DotNetBrowser DLL ,并且可以在执行期间自动提取。...它也不能用于暗示在单独 AppDomain(如 VSTO)运行代码环境。对于其他一些情况,例如播放使用专有编解码器编码内容,您必须自己构建、更新和维护 CEF。...使用 DotNetBrowser,您可以与需要在单独 AppDomain 运行代码应用程序集成,并在网页上执行复杂操作,而无需进行大量 JavaScript 注入。...: https://github.com/cefsharp/CefSharp/wiki/General-Usage [6] 加载项加载到单独 AppDomain : https://learn.microsoft.com

29340

.NET基础:应用程序域AppDomain

在 CLR 里、AppDomain就是用来实现代码隔离,每一个AppDomain可以单独创建、运行、卸载。...Assembly不能单独执行,它必须被加载到AppDomain,然后由AppDomain创建程序集中类型 及 对象。...每个AppDomain引用到某个类型时候需要把相应assembly在各自AppDomain初始化。因此,每个AppDomain单独保持一个类静态变量。...三、在新AppDomain创建对象 上文已经说了创建AppDomain了,但是创建AppDomain却是不包含任何对象,只是一个空壳子。那么如何在新AppDomain创建对象呢?..."; // 虽然此方法已经被标记为过时方法, msdn备注也提倡不使用该方法, // 但是 以.net 4.0 + win10环境测试,还必须调用该方法 否则,即便卸载了应用程序域 dll 还是未被解除锁定

1.1K60

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

当HttpApplication执行到Application_ResolveRequestCache时暂时控制权交给HttpHandler并根据HttpHandler是否启用SessionState...从运行程序时过程是这样:系统首先分配一段内存地址空间然后把控制权交给了CLR生成默认AppDomain,然后程序集加载到默认AppDomain,程序正式运行(系统在托管堆没有AppDomain...AppDomain创建AppDomain并将该虚拟目录程序集加载到AppDomain(虚拟目录可能不止一个程序集,而默认AppDomain会将整个虚拟目录下所有程序集加载到AppDomain上)...,如果该虚拟目录AppDomain已存在就直接使用该AppDomain,如果虚拟目录程序集发生变化(包括web.config变化),就会新建一个AppDomain再将以变化程序集加载到AppDomain...IIS5.x识别请求属于哪个Application是在工作进程在用户模式下实现,而IIS6.x是由Web Serverhttp.sys在核心模式实现(IIS5.x是Aspnet_isapi.dll

2.3K90

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

平常在多线程开发,总避免不了线程同步。本篇对net多线程锁系统做个简单描述。...程序域可以有多个,例子我们使用AppDomain.CreateDomain方法创建。 B:  按正常来说,每个程序域代码都是隔离,互不影响。...聪明CLR会把一些基本类型Object, ValueType, Array, Enum, String, and Delegate等所在程序集MSCorLib.dll,在CLR启动过程中都会加载到共享域...所以共享域中Loader heap MSCorLib.dllint实例会一直保留着,直到进程结束。单个程序域卸载也不受影响。作用域很大有没有!!!      这时第二个例子也很容易理解了。...锁int实例是跨程序域,MSCorLib基础类型都是这样, 极容易造成死锁。  而自定义类型则会加载到自己程序域,不会影响其他。 字符串锁 我们都知道锁目的,是为了多线程下值被破坏。

58450

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

Mudge 将此称为“牺牲进程”,因为它充当有效负载主机, Beacon 进程与代码任何故障隔离开来。 反射 DLL 被注入子进程以加载 .NET 运行时。...它可用于提高 .NET 应用程序性能、创建沙箱或只是做一些奇怪事情。我们做后者。 它可以做一件事是手动 .NET 程序集加载到任意应用程序域中。它可以从磁盘或内存执行此操作。...无论哪种方式,它都会加载到 AppDomain 。在程序集加载之后但在它运行之前,解密副本将被释放,然后使用 VirtualFree 从内存释放以阻止内存扫描器。...最后, 如果 CLR 已经加载到宿主进程,那么 donut shellcode 仍然可以工作。.NET 程序集将被加载到托管进程内新应用程序域中。....一次性应用程序域 当 donut 加载一个程序集时,它会将它加载到一个新 AppDomain

1.7K00

ASP.Net请求处理机制初步探索之旅 - Part 1 前奏

在IIS,对于asp.net请求一般是由aspnet_isapi.dll这个组件来进行.net运行时加载和具体请求处理。...有了基于ISAPI扩展扩展程序,IIS服务器就可以根据客户端请求资源扩展名,来决定应由哪个ISAPI扩展程序来处理客户端请求,然后就可以请求转发给合适ISAPI扩展程序。 ? ?...关于应用程序域: 使用.NET建立可执行程序,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中。...创建好AppDomain之后,就将请求转给该AppDomainISAPIRuntime对象,然后调用ISAPIRuntime对象ProcessRequest()方法来进行处理。 ?...此篇我将其称为前奏,是因为它是在ASP.Net核心处理部分之前,HTTP请求一步一步地传递给了ISAPIRuntime对象,后面我们再继续探索ASP.Net请求处理机制,今天就到此结束!

1.5K20

ILRuntime热更新

PE信息,以及当中类型所有信息,最终得到方法IL汇编码,然后通过内置IL解译执行虚拟机来执行DLL代码。...ILRuntime目标是读取热更新dll,编译成IL,然后使用自己JIT Compiler来执行热更dll代码,达到热更目的。...原理就是当IL解译器发现需要调用某个指定CLR方法时,实际调用重定向到另外一个方法进行挟持,再在这个方法对ILRuntime反射用法进行处理 从代码可以看出重定向工作是把方法挟持下来后装到ILIntepreter...使用默认无参数构造函数创建实例,可以使用Write方法写入,随着字节数据写入,数组大小自动调整。 参考博客:传送门 appdomain.LoadAssembly:需要热更dll载到解释器。...() { Debug.Log("热更DLL类型我们均需要通过AppDomain取得"); var it = appdomain.LoadedTypes["HotFix_Project.InstanceClass

2.2K30

Python在生物信息学应用:序列分解为单独变量

我们有一个包含 N 个元素元组或序列,现在想将它分解为 N 个单独变量。 解决方案 任何序列(或可迭代对象)都可以通过一个简单赋值操作来分解为单独变量。...唯一要求就是变量总数和结构必须与序列相吻合。...shares, price, (year, mon, day) = data >>> name 'ACME' >>> year 2012 >>> mon 12 >>> day 21 >>> 如果元素数量不匹配...例如: >>> s = 'Hello' >>> a, b, c, d, e = s >>> a 'H' >>> b 'e' >>> e 'o' >>> 当做分解操作时,有时候想丢弃某些特定值。...Python 并没有提供特殊语法支持这个需求,但是你可以使用任意变量名去占位,到时候不使用这些变量就行了。

12010
领券