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

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

dll后如果要更新业务代码,dll会被锁定,无法替换,需要重启应用 解决办法是通过AppDomain对业务项目dll独立加载,更新时进行卸载 1)创建一个RemoteLoader一个可穿越边界的类,作为加载...Plugin与临时dll文件夹PluginTemp 为什么要创建临时文件夹呢,因为我们需要在PluginTemp真正的加载dll,然后监听Plugin文件夹的文件变化,有变化时进行AppDomain卸载这个操作...,将Plugin的dll拷贝到PluginTemp文件夹,再重新加载dll 监听Plugin文件夹: private static readonly FileSystemWatcher _FileSystemWatcher...一样,程序会重启,这样就会再次调用被PreApplicationStartMethod注解标注的方法,不需要在代码做额外处理判断是首次加载还是更新加载,同时也做不到动态的将外部dll加入到MVC编译dll...体系,也只能启动前加载,查了很多资料,重新加载项目可以通过代码控制IIS回收程序池达到效果,但是因为各种繁琐的权限配置问题而放弃,我最后的解决方法是比较歪门邪道的方法,更新web.config文件的修改日期

25730
您找到你想要的搜索结果了吗?
是的
没有找到

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

前言                                   为什么我会起这样的一个标题,其实我原本只想了解asp.net的管道模型而已,但在查看资料的时候遇到不明白的地方又横向地查阅了其他相关的资料...从运行程序时的过程是这样的:系统首先分配一段内存地址空间然后把控制权交给了CLR生成默认AppDomain,然后将程序集加载到默认AppDomain,程序正式运行(系统在托管堆没有AppDomain...AppDomain创建AppDomain并将该虚拟目录的程序集加载AppDomain(虚拟目录可能不止一个程序集,而默认AppDomain会将整个虚拟目录下的所有程序集加载AppDomain上)...,如果该虚拟目录的AppDomain已存在就直接使用该AppDomain,如果虚拟目录的程序集发生变化(包括web.config变化),就会新建一个AppDomain再将以变化的程序集加载到新的AppDomain...,而IIS6.x开始使用了新组件http.sys)。

2.3K90

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

动态加载程序集,网上最多的说法是另外创建一个AppDomain,然后在新创建的AppDomain加载程序集。...所以首先要把程序集复制到临时目录,然后用Assembly.LoadFile去加载临时目录的程序集,这样就可以在运行期替换程序集了。...当然,我们还需要一个FileSystemWatcher来监控程序集的目录,当目录的程序集发生变化时,再把新的程序集复制到新的临时目录,然后再加载新临时目录的程序集文件。...需要注意的是由于FileSystemWatcher在文件被修改时会多次触发Changed事件,所以为了避免多次加载同一个程序集,我稍微处理了一下,加了一个Timer,当定时器事件触发的时候才去加载程序集...这可就不保险了,因为我们上面解释了,AppDomain.CurrentDomain可能包含多个版本的程序集。

66940

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

此外,本文以IIS经典模式为主,不讨论集成模式(IIS7后加入了集成模式,不用加载外部的aspnet_isapi.dll组件)。 一、当一个请求到来时 ①客户端发送一个请求给服务器端 ?...HTTP.SYS是一个位于Windows Server和Windows XP SP2的操作系统核心组件(内核模式),能够让任何应用程序通过它提供的接口,以HTTP协议进行信息通讯。...在IIS,对于asp.net的请求一般是由aspnet_isapi.dll这个组件来进行.net运行时的加载和具体请求的处理。...③应用程序域的加载 ?   在.NET运行时创建好之后,通过应用程序域工厂AppDomainFactory创建应用程序域AppDomain。...创建好AppDomain之后,就将请求转给该AppDomain的ISAPIRuntime对象,然后调用ISAPIRuntime对象的ProcessRequest()方法来进行处理。 ?

1.5K20

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

卸载AppDomain 监视AppDomain AppDomain FirstChance异常通知 宿主如何使用AppDimain 高级宿主控制 第二十三章 程序集加载和反射 程序集加载 使用反射构建动态可扩展应用程序...允许可扩展性意味着第三方代码可在你的进程运行。在 Windows中将第三方DLL加载到进程中意味着冒险。DLL的代码很容易破坏应用程序的数据结构和代码。...该Loader 堆的所有类型对象,以及为这些类型定义的方法JIT编译生成的所有本机代码,都会由进程的所有AppDomain共享。...宿主不能基于一些具体的加载项来构建和测试,因为加载项由不同公司创建,而且极有可能是在宿主应用程序发布之后才创建的。这是宿主为什么要在运行时发现加载项的原因。...(P515 1) 程序集加载 JIT编译器将方法的代码编译成本机代码时,会查看L代码引用了哪些类型。

75910

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

如上图所示,一个对象正好存放在一个AppDomain种,值也一样。一个AppDomain的对象引用必须是引用同一AppDomain的对象,AppDomain的行为就好像拥有自己私有的地址空间。...对于应用AppDomain的资源被加载,一直在内存,卸载AppDomain资源是唯一卸载模块或者程序集的途径,卸载AppDomain资源也是回收类型静态字段所占内存的唯一方式。      ...一个CLR软线程对象驻留在一个确定的AppDomain;一个给定的AppDomain可能有多个软线程对象。...在当前的CLR,对于给定的AppDomain,硬线程至多有一个软线程对象属于他,如果一个硬线程运行在多个AppDomain,每个AppDomain都会有一个明显的软线程对象属于该线程。...使用LoadBits方法加载程序集不会锁定          /// DLL文件,因为整个程序集被加载到内存并且文件句柄被关闭。

95550

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

理解运行过程 只是告诉大家如何定制咱的业务端的 dll 寻找路径 阅读本文能收获 了解 dotnet 的执行引擎(实际没有执行引擎这个概念)是如何被启动的 学会一个黑科技,自定义运行时所在的文件夹 了解为什么...这就是为什么 dotnet core 能独立框架的一个原因,也是为什么 dotnet core 可以不依赖系统安装的运行时框架的原因了。...加载程序集需要加载到一个 AppDomain 上,如果大家玩过插件开发,这部分将会更好的理解。...想要让咱的业务端的 dotnet 托管代码运行,就需要加载咱的程序集,需要将程序集放入一个 AppDomain 上 // 进行创建 AppDomain 的配置...,以及自己创建第一个 AppDomain 加载程序集 另外上面代码的另一个功能是让 Native 的其他语言编写的应用,可以加载使用 dotnet 编写的库。

49310

.NET基础:应用程序域AppDomain

在 .NET应用程序域AppDomain是CLR的运行单元,它可以加载应用程序集Assembly、创建对象以及执行程序。...Assembly不能单独执行,它必须被加载AppDomain,然后由AppDomain创建程序集中的类型 及 对象。...一个Assembly可以被多个AppDomain加载,一个AppDomain可以加载多个Assembly。...四、影像复制程序集 创建、卸载AppDomain都有、创建新对象也可以了,但是如果想完成热升级,还有一点小麻烦,那就是一个程序集被加载后会被锁定,这时候是无法对其进行修改的。...打开 影像复制程序集 功能,需要在创建新的AppDomain时做两步简单的设定即可: AppDomainSetup objSetup = new AppDomainSetup(); objSetup.ApplicationBase

1.1K60

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

,常常会遇到一些障碍而无法深入下去,或者是理解的浅显而不透彻(知道可以这样做,不知道为什么会是这样。...所以,创建进程需要加载一个可执行程序集(Windows 窗体、控制台应用程序等.exe文件)。当可执行程序集加载完毕,.Net会在当前进程创建一个新的应用程序域,称为 默认应用程序域。...应用程序域的基本操作 在.Net ,将应用程序域封装为了AppDomain类,这个类提供了应用程序域的各种操作,包含 加载程序集、创建对象、创建应用程序域 等。...代理(Proxy)和封送(Marshaling) 代理(Proxy) 现在我们在回到第3小节 在默认应用程序域中创建对象 的例子,通过上面Test2()的例子,很容易理解为什么Test1()没有抛出异常...Net需要在客户端(本例是ConsoleApp.exe)基于远程对象的元信息(metadata)创建代理。

56520

再说String

不过文中并没有为此提供充分的理论的基础,现在我就来谈谈为什么String的驻留是跨AppDomain的。 要明白Process-wide字符串驻留机制的原理,必须首先了解一个托管程序是如何运行的。...但是有些公用性很强的Assembly,比如我们经常使用的一些基元类型object, int,Array,ValueType等,却希望它被一个AppDomain加载之后,能够被其他的AppDomain共享...这些Assembly就是被加载到SharedDomain,我们常用的MScorLib.dll就是被以这样的方式被加载的SharedDomain的。...DefaultDomain可以通过AppDomain.CreateAppDomain创建另一个AppDomain。...当CLR被加载之后,会在SystemDomain对应的managed heap创建一个Hash table的数据结构,我们可以称这个Hashtable为Interning table,因为它是被用来保存被驻留的

30710

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

写过一个动态加载和释放程序的案例,基本实现了自己“兔死狗烹”,不留痕迹的设想。...无奈在最新的 .NET Core 3.1 ,已经不支持创建新的 AppDomain 了(据说是因为跨平台实现太重了),改为使用 AssemblyLoadContext 了。...,创建实例加载即可;卸载时需要注意的是一下几点: 使用 AssemblyLoaderContext 加载和卸载的代码必须要单独放在一个方法,不可以写在 Main 方法,否则加载的模块只有等待整个程序退出后才能卸载...但等待释放的方法要在加载卸载的代码”方法外,否则依然无法查看到它被回收 还有一点比较奇怪,如果我在最后不加 magickImageIns = null; 这一句,有时可以卸载,有时又无法卸载。...TIPS 在 Visual Studio 中提供了“模块窗口”,可以及时查看加载了哪些程序集,在 “调试” > “窗口” > “模块” 02.png 简单对比 AppDomain AppDomain

1.1K20

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

Office VSTO 将加载加载到单独的 AppDomain [6]以进行隔离。 DotNetBrowser 在非默认 AppDomain 运行。...事实上,可以在不同的 AppDomain 创建多个 Chromium 引擎并同时使用它们。因此,DotNetBrowser 可用于创建 VSTO 加载项。...此媒体无法在 CefSharp 播放。 要在 CefSharp 启用这些编解码器,您需要在启用专有编解码器的情况下自行重建 CEF。这是一项相当复杂的任务,可能需要长达一个月的时间[8]。...使用 DotNetBrowser,您可以与需要在单独的 AppDomain 运行代码的应用程序集成,并在网页上执行复杂的操作,而无需进行大量的 JavaScript 注入。...github.com/cefsharp/CefSharp/wiki/General-Usage [6] 将加载加载到单独的 AppDomain : https://learn.microsoft.com

30140

cefsharp播放视频_flash播放器手机版

原生CefSharp组件缺少Flash Player,实现内置浏览器功能时,不支持播放flash。...若想使用flash播放功能,我们需要在初始化CefSharp组件时,加载flash播放插件,并设置支持flash播放。...Chrome浏览器内核的flash插件文件为pepflashplayer.dll,将pepflashplayer.dll文件放在程序运行目录下,加载flash插件的C#代码如下: var setting..."); //设置flash插件版本 //使用指定的flash插件,不使用系统安装的flash版本 setting.CefCommandLineArgs.Add("ppapi-flash-path", AppDomain.CurrentDomain.BaseDirectory...的网站后,播放flash,可能出现”This Flash Player is not compatible with your region”的提示,说明该插件不支持在本地区(中国)使用,建议从其他软件找一个

1.7K20

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

一、前世今生 .NET诞生以来,程序集的动态加载和卸载都是一个Hack的技术,之前的NetFx都是使用AppDomain的方式去加载程序集,然而AppDomain并没有提供直接卸载一个程序集的API,而是要卸载整个...AppDomain才能卸载包含在其中的所有程序集。...可能有人另辟西经,创建别一个AppDomain加载/卸载程序集,但是由于程序集之间是不能跨域访问的,也导致只能通过Remote Proxy的方式去访问,这样在类型创建和使用上带来了一定的难度也是类型的继承变得相当复杂....NET Core中一直没有AppDomain的支持。...下面显示的是我们创建自定义AssemblyLoadContext的方法,实现一个可回收的Context需要在构造器中指定isCollectible: true : public class CollectibleAssemblyLoadContext

1K30

将 .NET 程序集注入现有进程

image.png 注入组装有两个组件: BOF 初始化程序:一个小程序,负责将程序集加载器注入远程进程并传递任何参数。...PIC 程序集加载器:项目的大部分。加载程序将初始化 .NET 运行时、加载提供的程序集并执行程序集。...加载程序将在目标进程创建一个新的 AppDomain,以便在执行完成时可以完全卸载加载的程序集。 远程进程和 Beacon 之间的通信通过命名管道进行。...即使程序集已加载到当前进程,也不会阻塞 Beacon。 用法 下载并加载inject-assembly.cna Aggressor 脚本到Cobalt Strike 。...指定 0 作为要在当前 Beacon 进程执行的 PID。 建议使用其他工具(如FindObjects-BOF)来定位已加载 .NET 运行时的进程,但这不是注入程序集运行的要求。

87930

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

一个 AppDomain 可以存在多个 Assembly,一个进程可以存在多个 AppDomainAppDomain 旨在在执行程序集之间提供与通常为进程提供的相同级别的隔离。...否则,它是从内存获取的。无论哪种方式,它都会加载到新的 AppDomain 。在程序集加载之后但在它运行之前,解密的副本将被释放,然后使用 VirtualFree 从内存释放以阻止内存扫描器。...一次性应用程序域 当 donut 加载一个程序集时,它会将它加载到一个新的 AppDomain 。...通过在其自己的 AppDomain 运行有效负载,这允许开发在一次性 AppDomain 运行后利用模块的工具。可以卸载应用程序域,但不能卸载单个程序集。...因此,要在完成后卸载程序集,您必须将其放入自己的 AppDomain 并卸载它。

1.7K00

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

在该程序域初始化过程,由它将msCorLib.dll这个程序集(这是一个很重要的程序集,.NET类型系统最基本的类型定义其中)加载到共享程序域中。此外,驻留的字符串也被保存在此系统程序域中。...", AppDomain.CurrentDomain.FriendlyName); 20: } 21: } 22: } 然后我再一个控制台应用的Main方法,编写了如下简单的代码...如右图所示:如果某个类型被定义在程序集中Foo.Dll,当AppDomain1和AppDomain2需要使用该类型的时候,它们会分别以独占的方式加载程序集Foo.Dll。...为此我在上面创建的解决方案添加了一个类库项目Lib,ConsoleApp引用Lib项目,并在Lib定义了一个空的Foo类型。...对于控制台应用,你只需要在Main方法上应用LoaderOptimizationAttribute特性,并指定LoaderOptimization为MultiDomain即可。

63890

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

下面简单谈一谈: .NET Framework 开荒时期有 AppDomain 域之隔离术,包括有创建、加载程序集、卸载等方法,囊括百家程序集,一刀以斩之。...对于前辈们来说谈到 AppDomain 可以口若悬河滔滔不绝,可惜我进入 C# 时间比较晚,对 AppDomain 的印象并不是很深,在应用上也没有什么造诣,仅此泛泛而言。...时间进入了 .NETCore 时代,AppDomain 在升级大潮受到了致命打击, Create 方法和 Unload 方法经岁月升级后的源码充斥着 throw 和 throw ,完全丧失了功能,取而代之的是...对 ALC 封装的一些建议: 1、如果没有非托管代码,尽量不要在析构函数里折腾代码。...3、肉眼观测内存时,测试代码尽量不要在 Main 函数里做元数据的相关操作,主线程是 GC 的一个干扰点。 4、若对内存的开销比较敏感,请尽可能分域,并结合弱引用实现创建与销毁。

65910
领券