CharlesChen's Technical Space

简单实用是我一直在软件开发追求的目标(I Focus on. Net technology, to make the greatest efforts to enjoy the best of life.)
Not the best, only better
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

WinCE5.0移动平台开发笔记(Appdomain之间共享数据变量)

Posted on 2010-05-16 16:05  Charles Chen  阅读(1047)  评论(0编辑  收藏  举报

      在项目开发过程中,因项目的需求,在客户端部署的两个.Net 应用程序需要共享一个变量,即:一个.Net应用程序设置了变量的值,那么在另外一个.Net应用程序中就能读取到设置的值。简单来说,需要跨不同的AppDomain来共享变量。

    我们知道进程之间的通信有下面几种方法:

1.串口RS232通信(自己定义数据格式,通用性差,出错面临挑战)

2.Socket(自己定义格式,出错验证方面)

3.RPC(远程调用)

4.DCOM(分布式的组件)

5.Web Service

6.Remoting(远程对象模型)

7.WCF(新一代的SOA框架)

8.文件读取等(共享锁定,冲突等)

9.程序的命令行参数。。。。(启动程序时候传递)

10.MSMQ。。。

有很多的进程之间的通信方式,这就根据项目的需要和程序的运行环境来决定采取何种方式来满足项目的目的或要求。

最后我们在项目中决定采用Remoting来实现,有以下几个原因:

1.基于.Net 2.0的winform应用程序

2.开发的效率(Socket需要自己定义格式)

3.尽可能上的依赖其他资源(如文件)

而且使用Remoting技术本身就是.Net程序之间进行分布式的对象调用比较好的方法之一,而且配置方面,开发效率高。

      补充:Remoting开发过程:

1、Remoting框架

2、远程对象的两个含义:

操作远程对象:对象运行在远程,客户端向他发送消息 MarshalByRefObject

传递远程对象:将远程的对象拿到本地,或者将本地对象发送到远程。对副本进行操作 [Serializable]或ISerializable

3、谁来激活对象?

3.1 服务器激活(WellKnown):对于所有的客户端是一样的。不分客户

3.1.1 Singleton

3.1.2 SingleCall

3.2客户端激活:可以为每一个客户端保存会话状态.

4、通道(Channels)

一个远程对象使用通道发送和接受消息

Remoting提供了内置的通道:TCP通道和HTTP通道,自定义通道

5.开发Remoting步骤:

5.1创建一个远程对象(面向分布是对象的)

继承于System.MarshByRefObject,如:public class HelloTest:MarshByRefObject{}

5.2创建一个宿主程序

5.2.1注册通道:内置通道:TCP,HTTP

5.2.2注册服务器激活的远程对象(WellKnown)

Singleton,SingleCall

URL

5.2.3运行宿主程序

5.3建立客户端程序

5.3.1注册通道:内置通道:TCP,HTTP

5.3.2根据URL得到对象代理

5.3.3使用代理调用远程对象

 

下面来实现项目中遇到的跨不同AppDomain中变量访问:

1.远程对象:

代码
 public class ShareDataList : MarshalByRefObject
    {
        
public static string ShareData =string.Empty;//静态变量在不同.Net应用程序之间共享
        public ShareDataList()
        {
            Console.WriteLine(
"ShareDataList activated");
        }
        
public void SetData(string data)
        {
            ShareData 
= data;
        }
    }

 

2.服务器端(宿主程序)

代码
    public static int Main(string [] args) 
        {
            Console.WriteLine(ShareDataList.ShareData);
            TcpChannel chan1 
= new TcpChannel(8085);
            ChannelServices.RegisterChannel(chan1,
false);
            RemotingConfiguration.RegisterWellKnownServiceType
                (
                
typeof(ShareDataList),
                
"ShareData",
                WellKnownObjectMode.Singleton
                );            

            System.Console.WriteLine(
"Press Enter key to exit");
            System.Console.ReadLine();
            Console.WriteLine(ShareDataList.ShareData);
            System.Console.ReadLine();
            
return 0;
        }

 

 3.客户端

代码
public static void Main(string[] args)
        {
            
//使用TCP通道得到远程对象
            TcpChannel chan1 = new TcpChannel();
            ChannelServices.RegisterChannel(chan1, 
false);
            ShareDataList obj1 
= (ShareDataList)Activator.GetObject(
                
typeof(RemotingSamples.ShareDataList),
                
"tcp://localhost:8085/ShareData");
            
if (obj1 == null)
            {
                System.Console.WriteLine(
                    
"Could not locate TCP server");
            }
            obj1.SetData(
"传递到另一个.Net Application一个值");//调用远程对象设置共享变量的值
            Console.ReadLine();
        }

 

通过上面的代码,客户端调用SetData()方法设置共享变量ShareData的值,那么在服务器端就可以直接获取到设置好的ShareData的值。这样就在技术上实现了,当然也达到了项目中的要求。

Best Regards,

Charles Chen

http://charles2008.cnblogs.com/