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. 循环 for 读取文件

    cat filename(待读取的文件) | while read line do echo $line done

  2. php扩展安装,指定新的openssl

    1 自己从源码编译一个新的openssl 下载源码下来解压到 /mnt/soft/openssl-1.0.2m (openssl 安装到) ./config -h /usr/bin/perl ./Co ...

  3. 八、asynicio模块以及爬虫应用asynicio模块(高性能爬虫)

    asynicio模块以及爬虫应用asynicio模块(高性能爬虫) 一.背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行, ...

  4. 2018微信小程序官方示例源码最新版

    忘记从哪获得的 CSDN  可以支持一下 谢谢你们 https://download.csdn.net/download/lan1128/10197682 当然也有免费的 代码在码云上免费公开 点个关 ...

  5. MySQL事务以及特征

    1.什么是事务? 在现实生活中,我们往往会进行转账操作.转账可以分为两部分完成,转入和转出,只要两部分都完成了才算转账完成.在数据库中,这个过程是由两条sql语句来完成的, 如果任意一方的语句没有执行 ...

  6. 【BZOJ 3681】Arietta

    传送门 题目描述 Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中. 但是她从未停止过和恋人 Velding 的书信往来.一天,她准备去探访他. 对着窗外的阳光,临 ...

  7. UIScrollView的简单使用

    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds]; //将scrollView添加到当前 ...

  8. 购物网站被p.egou.com强制恶意劫持

    今天早上打开电脑浏览京东,发现随便点击商品,都自动转化为淘客推广的页面, 我以为是360浏览器自己干的,然后我换了谷歌,也是一样,难道这是电脑里面有流氓插件? 我又换了火狐,还是一样,没办法了,换IE ...

  9. 为什么second是秒也是第二?

    起源 早期在西方,一小时分为 60 分钟.后来,科学发达了.文明进步了,人们认为一分钟太粗放了.必须划分得更细致,于是就把一分钟划分成 60 等分.由于是对时间的第二次划分,就将新的 60 等分的“单 ...

  10. C# 之 数组倒叙排列

    //倒叙排列 string temp=""; ; i < strlist.Length / ; i++) { temp = strlist[i]; strlist[i] = ...