当前位置:网站首页>《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的路径进行加载
边栏推荐
- Codeforces Round #652 (Div. 2)
- Application of keil5 integrated development environment for single chip microcomputer
- 2019.11.20 training summary
- 2019.10.27训练总结
- 同花顺炒股软件可靠吗,安全吗?
- Summary after the 2009 ICPC Shanghai regional competition
- JVM instructions for four call methods
- Seaweedfs security configuration
- 1021 deep root (25 points)
- TLAB of JVM
猜你喜欢

Application of keil5 integrated development environment for single chip microcomputer

Picture verification code control

Alibaba cloud firewall configuration, multiple settings (iptables and firewall)

Ce projet Open source est super wow, des photos manuscrites sont générées en ligne

The Stones Game【取石子博弈 & 思维】

Time varying and non time varying

六度空间 bfs

QGIS mapping

Judgment of points inside and outside polygon

SeaweedFS安全配置(Security Configuration)
随机推荐
2019.10.16 training summary
Web vulnerability manual detection and analysis
2019.10.6 training summary
Time varying and non time varying
L2-025 分而治之 (25 分)
Codeforces - 1151b thinking
Acwing271 [teacher Yang's photographic arrangement] [linear DP]
Ural1517 freedom of choice [suffix array: longest common continuous substring]
I would like to know how to open an account for free online stock registration? In addition, is it safe to open a mobile account?
L1-009 sum of N numbers (20 points)
Ce projet Open source est super wow, des photos manuscrites sont générées en ligne
Shanke's C language 2018 exercise (Telecom)
时变和非时变
Wandering --- 最后的编程挑战
Dynamic planning summary
2019.10.16训练总结
L2-026 small generation (25 points)
2019.10.27 training summary
2019.10.23训练总结
If I were in Beijing, where would it be better to open an account? In addition, is it safe to open an account online now?