public class MyTask
{
public class MyEventArgs : EventArgs
{
public object EventData { get; private set; } public MyEventArgs(object eventData)
{
this.EventData = eventData;
}
} public event EventHandler<MyEventArgs> MyEvent; public void DoWork()
{
Console.WriteLine("Start");
var i = ;
while (i++ < )
{
Thread.Sleep();
var temp = this.MyEvent;
if (temp != null)
temp(this, new MyEventArgs("MyEvent(" + i.ToString() + ")"));
}
Console.WriteLine("End");
}
} public static class NewAppDomain
{
/// <summary>
/// 无参调用
/// </summary>
/// <param name="action"></param>
public static void Execute(Action action)
{
AppDomain domain = null; try
{
domain = AppDomain.CreateDomain("New App Domain: " + Guid.NewGuid()); var domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap(
typeof(AppDomainDelegate).Assembly.FullName,
typeof(AppDomainDelegate).FullName); domainDelegate.Execute(action);
}
finally
{
if (domain != null)
AppDomain.Unload(domain);
}
} /// <summary>
/// 有参调用
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="parameter"></param>
/// <param name="action"></param>
public static void Execute<T>(T parameter, Action<T> action)
{
AppDomain domain = null; try
{
domain = AppDomain.CreateDomain("New App Domain: " + Guid.NewGuid()); var domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap(
typeof(AppDomainDelegate).Assembly.FullName,
typeof(AppDomainDelegate).FullName); domainDelegate.Execute(parameter, action);
}
finally
{
if (domain != null)
AppDomain.Unload(domain);
}
} /// <summary>
/// 有返回值的无参调用
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="action"></param>
/// <returns></returns>
public static T Execute<T>(Func<T> action)
{
AppDomain domain = null; try
{
domain = AppDomain.CreateDomain("New App Domain: " + Guid.NewGuid()); var domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap(
typeof(AppDomainDelegate).Assembly.FullName,
typeof(AppDomainDelegate).FullName); return domainDelegate.Execute(action);
}
finally
{
if (domain != null)
AppDomain.Unload(domain);
}
} /// <summary>
/// 有返回值的有参调用
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TResult"></typeparam>
/// <param name="parameter"></param>
/// <param name="action"></param>
/// <returns></returns>
public static TResult Execute<T, TResult>(T parameter, Func<T, TResult> action)
{
AppDomain domain = null; try
{
domain = AppDomain.CreateDomain("New App Domain: " + Guid.NewGuid()); var domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap(
typeof(AppDomainDelegate).Assembly.FullName,
typeof(AppDomainDelegate).FullName); return domainDelegate.Execute(parameter, action);
}
finally
{
if (domain != null)
AppDomain.Unload(domain);
}
} private class AppDomainDelegate : MarshalByRefObject
{
public void Execute(Action action)
{
action();
} public void Execute<T>(T parameter, Action<T> action)
{
action(parameter);
} public T Execute<T>(Func<T> action)
{
return action();
} public TResult Execute<T, TResult>(T parameter, Func<T, TResult> action)
{
return action(parameter);
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
//1.无参无返回值调用,兼跨域事件调用
NewAppDomain.Execute(() =>
{
var mytask = new MyTask();
mytask.MyEvent += new EventHandler<MyTask.MyEventArgs>(mytask_IndexChanged);
mytask.DoWork();
}); //2.有参无返回值调用
var dt = DateTime.Now.ToString();
NewAppDomain.Execute<string>(dt, args =>
{
Console.WriteLine(args);
}); //3.无参有返回值调用
var result = NewAppDomain.Execute(() => { return "helloworld"; }); //4.有参有返回值调用
var parameter = new List<string> { "a", "b", "c" };
var result2 = NewAppDomain.Execute(parameter, args => { return string.Join("|", args); });
} void mytask_IndexChanged(object sender, MyTask.MyEventArgs e)
{
Debug.Print("Event:" + e.EventData.ToString());
}

c# 跨应用程序域通讯的更多相关文章

  1. 【.net 深呼吸】跨应用程序域执行程序集

    应用程序域,你在网上可以查到它的定义,凡是概念性的东西,大伙儿只需要会搜索就行,内容看了就罢,不用去记忆,更不用去背,“名词解释”是大学考试里面最无聊最没水平的题型. 简单地说,应用程序域让你可以在一 ...

  2. HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术

    最近做项目在前端我使用了很多新技术,这些技术有bootstrap.angularjs,不过最让我兴奋的还是使用了HTML5的技术,今天我想总结一些HTML5的技术,好记性不如烂笔头,写写文章可以很好的 ...

  3. android 史上最简单易懂的跨进程通讯(Messenger)!

    不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...

  4. 跨应用程序域(AppDomain)的单例(Singleton)实现

    转载自: 跨应用程序域(AppDomain)的单例(Singleton)实现 - CorePlex代码库 - CorePlex官方网站,Visual Studio插件,代码大全,代码仓库,代码整理,分 ...

  5. html5跨域通讯之postMessage的用法

    转自:http://www.cnblogs.com/wshiqtb/p/3171199.html postMessagePortal.html 页面代码 <!DOCTYPE html> & ...

  6. iframe跨域通讯

    工作中遇到一个问题,IFRAME嵌套了一个外部页面用于统计 统计的JS由我们提供,并且需要提供热点图 一开始就碰到的问题就是 不知道页面高度 需要子页面传回页面高度用于将IFRAME拉升到合适高度 当 ...

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

    在目前的项目开发中,分布式开发已经逐渐成为主流.一个项目要是没有采用分布式架构,都不好意思跟别人说这是一个完整的项目.这句话虽然有些过激,但是随着人们对效率的要求在提高,以及产品需要提升用户体验.只有 ...

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

    转眼就到了元宵节,匆匆忙忙的脚步是我们在为生活奋斗的写照,新的一年,我们应该努力让自己有不一样的生活和追求.生命不息,奋斗不止.在上篇博文中主要介绍了.NET的AppDomain的相关信息,在本篇博文 ...

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

    在目前的项目开发中,分布式开发已经逐渐成为主流.一个项目要是没有采用分布式架构,都不好意思跟别人说这是一个完整的项目.这句话虽然有些过激,但是随着人们对效率的要求在提高,以及产品需要提升用户体验.只有 ...

随机推荐

  1. 使用parted 创建一个大于2T的分区

    1.查看现有分区 parted -l fdisk   -l     2.对/dev/sdb分一个区 [root@test ~]# parted /dev/sdb   (parted) mkpart  ...

  2. Ubuntu16.04下安装httpd+svn+viewVC

    一.安装httpd 1.下载httpd 网址:http://httpd.apache.org/download.cgi#apache24 下载这一条---Source: httpd-2.4.39.ta ...

  3. 转载:PHP编程规范

    PHP-FIG 在说啥是PSR-[0-4]规范的之前,我觉得我们有必要说下它的发明者和规范者:PHP-FIG,它的网站是:www.php-fig.org.就是这个联盟组织发明和创造了PSR-[0-4] ...

  4. 找不到javax.

    https://blog.csdn.net/q343509740/article/details/79515911 idea导入java工程 file --> new -->存在的工程

  5. ubuntu 设置apt-get 代理

    1 添加apt-get 代理配置文件 sudo vi /etc/apt/apt.conf.d/proxy.conf 2 添加内容 Acquire::http::Proxy "http://w ...

  6. 清华集训2014 sum

    清华集训2014sum 求\[∑_{i=1}^{n}(-1)^{⌊i√r⌋}\] 多组询问,\(n\leq 10^9,t\leq 10^4, r\leq 10^4\). 吼题解啊 具体已经讲得很详细了 ...

  7. wordpress设置本地化语言

    wordpress语言本地化 在wordpress上很多插件不支持本地化语言如:中文,需要本地化,则需要制作本地化语言的po(用于编辑)和mo(用于机器识别)文件.可以没有*.po文件,但是不能没有* ...

  8. MySQL——复制(Replication)

    1.复制概述 1.1.复制解决的问题数据复制技术有以下一些特点:(1)    数据分布(2)    负载平衡(load balancing)(3)    备份(4)    高可用性(high avai ...

  9. GDOI2017总结

    前言 大概在两个星期前,由于会有一堆人因为限人数的问题而被卡掉,当时那个人心惶惶啊,搞到我们心惊胆战,茶饭不安. 话说某日,jacky36当众表示,辣鸡余可灿,把我卡掉啦,B~(屏蔽不良言语).余可灿 ...

  10. 【NOIP2016提高A组模拟8.14】总结

    第一题是几何题,没去想直接弃疗.... 第二题觉得很像背包,但是单挑人的顺序不同,答案也会不同,我比较了每个人先后的优劣性,成功搞定了这道题.但是再输出时不小心搞错了,爆零. 第三题,我答案了整整一个 ...