当前位置:网站首页>《CLR via C#》读书笔记-加载与AppDomain
《CLR via C#》读书笔记-加载与AppDomain
2022-06-29 09:26:00 【zlbcdn】
###情景
公司有一项目,需要TeamA与TeamB协同完成(或两个公司决定共同开发一款程序),两者按照协定好的接口进行开发。TeamA的程序需要加载TeamB开发的方法,这样才能完成整个软件。另外,TeamA的程序需要设定TeamB的插件的安全权限及其他的基础设定,避免TeamB的插件破坏TeamA开发的程序。如下图所示:
即,既需要你,但又要限定你!
###解决方案:
在C#中会用AppDomain形成一个安全区域,将TeamB的插件进行隔离。然后使用C#的加载功能,将插件加载,然后运行插件中的方法!实现了安全又隔离!
###代码
先定义接口。接口文件如下:
####接口定义
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HostSDK
{
public interface IAddIn
{
string DoSometing(int x);
}
}
很简单的一个双方约定的接口。下面是TeamB的具体实现:
####插件的实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HostSDK;
namespace AddInType
{
public class PlugInTeamB: MarshalByRefObject, IAddIn
{
public string DoSometing(int x)
{
return "B加载项的方法:" + 2 * x + "\n DoSomething方法所在的AppDomain为:" + AppDomain.CurrentDomain.FriendlyName;
}
}
}
非常简单的实现方法,不过注意一点,此时插件是继承了MarshalByRefObject基类。
####实际的调用
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using HostSDK;
namespace ReflectionDemo
{
class Program
{
public static void Main(string[] args)
{
//获取加载项的路径
string AddInDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
//展示当前的AppDomain
Console.WriteLine("目前所在的AppDomain为:"+ AppDomain.CurrentDomain.FriendlyName);
//第一步(1):在某路径下,先找到所有的DLL,然后根据条件进行筛选
string[] AddInAssemblies = Directory.GetFiles(AddInDir, "*.dll");
foreach (string item in AddInAssemblies)
{
Console.WriteLine("待查找的加载项名称:{0}",item);
}
//第一步(2):根据条件筛选
List<Type> AddInType = new List<Type>();
List<string> assemblyList = new List<string>();
foreach (string item in AddInAssemblies)
{
Assembly AddInAssembly = Assembly.LoadFrom(item);
foreach (Type t in AddInAssembly.GetExportedTypes())
{
if (t.IsClass && typeof(IAddIn).IsAssignableFrom(t))
{
AddInType.Add(t);
assemblyList.Add(AddInAssembly.FullName);
}
}
}
//第一步(3):展示已经查找的DLL相关信息
Console.WriteLine("经过查找,已找到:"+ assemblyList.Count+",具体如下:");
foreach (string item in assemblyList)
{
Console.WriteLine(" 已经找到的assembly信息名称:"+item);
}
//第二步:创建新的AppDomain,并在新的AppDomain中创建实例,并调用相关方法
AppDomain sandBoxAppDomain = AppDomain.CreateDomain("SandBoxAppDomain", null, null);
//新的AppDomain中创建实例,并调用相关方法
IAddIn addInB=(IAddIn)sandBoxAppDomain.CreateInstanceAndUnwrap(assemblyList[0], "AddInType.PlugInTeamB");
Console.WriteLine("调用TeamB的方法,其方法的返回信息如下:"+addInB.DoSometing(2));
//第三步:卸载AppDomain
AppDomain.Unload(sandBoxAppDomain);
Console.Read();
}
}
}
####实际的输出
####代码下载
待会儿放链接-Mark
###说明
在“插件的实现”中,代码为:
public class PlugInTeamB: MarshalByRefObject, IAddIn
{
public string DoSometing(int x)
.....
}
上面实现了MarshalByRefObject基类,所以最后输出结果为:“DoSomething方法所在的AppDomain为:SandBoxAppDomain”
若将基类去除,然后添Serializable的Attribute,则输出结果将为:“DoSomething方法所在的AppDomain为:ReflectionDemo.exe”
这就涉及到按值还是按引用传递
####总结
使用上面的小demo,就可以创建一个小的“热插拔”的隔离程序。更关键的是,可以指定第三方DLL的路径进行加载
边栏推荐
- 六度空间 bfs
- Codeforces Round #645 (Div. 2)
- Dev使用过程中的基本操作
- 在VMware workstation中安装WMware ESXi 6.5.0并进行配置
- To 3 --- 最后的编程挑战
- 2021 team programming ladder competition - Simulation Competition
- 2019.10.27 training summary
- Is it safe to open a stock account with the QR code given by the manager of a securities firm? I want to open an account
- L2-026 小字辈 (25 分)
- Analyze in detail the PBOT mining virus family behavior and the principle of exploited vulnerabilities, and provide detailed protection suggestions for the blue army
猜你喜欢
随机推荐
September 29, 2020 non commodity templating code level rapidjson Library
manacher
Codeforces Round #657 Div. 2
SymPy Tutorial(译)
DevExpress的双击获取单元格数据
September 23, 2020 left and right values reference std:: move()
2019.10.16 training summary
Serpentine filling number
2021年团体程序设计天梯赛-模拟赛
2019.10.6 training summary
Nacos registry cluster
The Stones Game【取石子博弈 & 思维】
Rikka with Cake(线段树+线段树)
L1-009 sum of N numbers (20 points)
Sixteen system counter and flow lamp
Maze walking BFS medium + -- the last programming challenge
Weight recursion of complete binary tree -- the last programming challenge
Shanke's C language 2018 exercise (Telecom)
CodeForces - 1151B 思维
Dynamic linking of virtual machine stack of JVM









