netcore热插拔dll
项目中有有些场景用到反射挺多的,用到了反射就离不开dll的加载。此demo适用于通过反射dll运行项目中加载和删除,不影响项目。
ConsoleApp:
1 using AppClassLibrary;
2 using System;
3 using System.Collections.Generic;
4 using System.IO;
5 using System.Linq;
6 using System.Runtime.Loader;
7 using System.Threading;
8
9 namespace ConsoleApp
10 {
11 class Program
12 {
13 static void Main(string[] args)
14 {
15 Console.WriteLine("************非反射调用**************");
16 ICommon common = new Say();
17 common.Invoke();
18 Console.WriteLine("************非反射调用**************");
19 Console.WriteLine();
20 Console.WriteLine("**************反射调用***************");
21 InvokeMethod();
22 Console.WriteLine("**************反射调用***************");
23 Console.Read();
24 }
25 private static void InvokeMethod()
26 {
27 bool IsGo = true;
28 while (IsGo)
29 {
30 Thread.Sleep(3000);
31 List<ICommon> common_List = new List<ICommon>();
32 var path = Directory.GetCurrentDirectory();
33 string[] fileInfos = Directory.GetFiles(path).Where(f => f.Contains("comm")).ToArray();
34 var _AssemblyLoadContext = new AssemblyLoadContext(Guid.NewGuid().ToString("N"), true);
35 Dictionary<string, ICommon> fileInfoList = new Dictionary<string, ICommon>();
36 foreach (var file in fileInfos)
37 {
38 ICommon common;
39 using (var fs = new FileStream(file, FileMode.Open, FileAccess.Read))
40 {
41 var assembly = _AssemblyLoadContext.LoadFromStream(fs);
42 Type type = assembly.GetExportedTypes().Where(t => t.GetInterfaces().Contains(typeof(ICommon))).FirstOrDefault();
43 common = Activator.CreateInstance(type) as ICommon;
44 }
45 FileInfo fileInfo = new FileInfo(file);
46 common.Invoke();
47 }
48 }
49 }
50 }
51 public class Say : ICommon
52 {
53 public void Invoke()
54 {
55 Console.WriteLine($"{this.GetType()} Say Method ");
56 }
57 }
58 }
接口类库:
using System; namespace AppClassLibrary
{
public interface ICommon
{
void Invoke();
}
}
comm_Print.dll:
using AppClassLibrary;
using System; namespace comm_Print
{
public class Print : ICommon
{
public void Invoke()
{
Console.WriteLine($"{this.GetType()} Print Method ");
}
}
}
comm_Trace.dll:
using AppClassLibrary;
using System; namespace comm_Trace
{
public class Trace : ICommon
{
public void Invoke()
{
Console.WriteLine($"{this.GetType()} Trace Method ");
}
}
}
下面2个dll可以任意添加删除:

删除trace.dll运行结果:

netcore热插拔dll的更多相关文章
- Linux部署.NetCore站点 使用Supervisor进行托管部署
前言 之前终于在Linux上部署好了.NetCore站点,但是这个站点非常“脆弱”.当我的ssh连接关闭或者我想在当前连接执行其他命令时候就必须关闭dotnet站点的执行程序.这显然不是我想要达到的效 ...
- NetCore1.1+Linux部署初体验
1.环境准备 Centaos7+Win10 虚拟机 Win10安装VS2017 https://www.asp.net/downloads注意勾选下.Net Core 3.Centaos安装netco ...
- JenKins使用pm2部署.net core网站
登录事先准备好的 Jenkins 1 新建任务 2 源码管理 git 输入正确地址 3 构建环境:Delete workspace before build startsAbort the build ...
- NEO
平台: Windows 类型: 虚拟机镜像 软件包: .net core neo application server basic software blockchain neo open sourc ...
- NetCore1.1+Linux
NetCore1.1+Linux部署初体验 1.环境准备 Centaos7+Win10 虚拟机 Win10安装VS2017 https://www.asp.net/downloads注意勾选下.N ...
- .NET Core 使用 K8S ConfigMap的正确姿势
背景 ASP.NET Core默认的配置文件定义在appsetings.json和appsettings.{Environment}.json文件中. 这里面有一个问题就是,在使用容器部署时,每次修改 ...
- 使用 Dockerfile 文件但是不使用缓存生成镜像
前一段时候使用 Dockerfile 重新部署 NetCore3.1 项目的时候很顺利,由来由于一些原因,我把以前的镜像删除,如果我们大家继续使用 docker build 命令去生成镜像的话就会报 ...
- .NetCore(Avalonia) 项目dll混淆,Ubuntu 或者deepin操作系统 deb安装包解压,重新打包
.NetCore(Avalonia) 项目dll混淆,deb安装包解压,重新打包 本文分为两部分,一部分是介绍使用 DotNetReactor6.0 及以上版本混淆.netcore项目的dll. 另一 ...
- .Net core 的热插拔机制的深入探索,以及卸载问题求救指南.
.Net core 的热插拔机制的深入探索,以及卸载问题求救指南. 一.依赖文件*.deps.json的读取. 依赖文件内容如下.一般位于编译生成目录中 { "runtimeTarget&q ...
- .netcore跨平台 之 windows上编译,ubuntu上运行
1 下载并安装netcore sdk 下载地址 https://github.com/dotnet/cli 选取合适的版本下载安装即可 打开 CMD ,输入dotnet,出现以下信息说明已安装好 ...
随机推荐
- C# OpenCvSharp MatchTemplate 多目标匹配
效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.D ...
- C#中字典集合的两种遍历
记录一下 Dictionary<string, string> dictionary = new Dictionary<string,string>(); foreach (s ...
- java 计算两个date日期相差天数或者时间差
相差天数计算: /** * 相差天数计算 */ public int differentDaysByMillisecond(Date date1, Date date2) { return Math. ...
- vue项目 nginx部署
nginx.conf中的server配置片段 server { listen 8080 ;#默认端口是80,如果端口没被占用可以不用修改 server_name localhost; #charset ...
- Circle Loss:从统一的相似性对的优化角度进行深度特征学习 | CVPR 2020 Oral
论文提出了Circle loss,不仅能够对类内优化和类间优化进行单独地处理,还能根据不同的相似度值调整对应的梯度.总体而言,Circle loss更灵活,而且优化目标更明确,在多个实验上都有较好的表 ...
- KingbaseESV8R6汉字首字母排序
目的 本文目的实现汉字首字母排序. 排序规则和字符集的关系如下. select sys_encoding_to_char(collencoding) as encoding,collname,coll ...
- VS Qt扩展插件下载地址
使用vs开发qt项目,需要安装qt插件 QT插件下载地址:https://mirrors.ustc.edu.cn/qtproject/official_releases/vsaddin/
- css 如何绘制正方形
前言 如何绘制正方形的问题呢,在这里我先只写一种方式,后续补齐. 正文 写正方形有一个很特殊的地方就在于我们在写html的时候,宽是一定固定的,因为不可能溢出去,但是高就不固定了,因为可能要滑动. 问 ...
- docker 应用篇————dockerfile[十四]
前言 简单介绍一下dockerfile. 正文 dockerfile就是docker image的构建文件. 然后来运行一下. 然后就产生了test:1.0 这个镜像. 然后启动一下你就发现了这个镜像 ...
- Power Outage
由于Covid-19的原因一直是work from home, 在几天前家里的电表有问题需要人来维修,在这期间会停电大概半小时操作,虽然是wfh,但是还是要保障工作的正常进行,保守估计可以顺利渡过. ...