`
wzhiju
  • 浏览: 141399 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用C#开发CORBA

阅读更多
使用.NET开发corba应用
一、 什么是IIOP.NET
IIOP.NET 是通过使用基于corba的IIOP支持.NET、javaEE和corba组件实现无缝互操作的技术。如图1.1所示,这种解决方案依赖于.NET Remoting 体系结构的可扩展性,以提供透明的对象级的集成,同时不会导致网关或基于 SAOP 产品引起的性能上的开销。

图1.1
二、 为什么使用IIOP.NET
现今基于.net开发corba应用程序的工具主要有:janeva,IIOP.NET, Remoting.Corba。其中,janeva 是Borland公司发布的一个新产品,但其缺点是不开源,并且收费;Remoting.Corba 是一个开源的项目,但由于处于初始开发阶段,许多功能尚不具备,比如编译IDL文件,某些corba 类型参数也不支持;IIOP.NET 也是一个开源的开发项目,相关的功能也已经成熟,其优势主要体现在,
(1) 性能。IIOP 比SOAP 更轻量级,更有效;
(2) .NET Remoting通道像它连接的对象一样共享相同的进程,而且既不需要分开的网关, 也不需要另外的间接层;
(3) 可靠性。IIOP定义了至多一次调用的语法规则,确保方法调用只处理一次;
(4) 可用性。IIOP.NET提供了灵活强大的CORBA模型,被集成在直观的.NET Remoting 中。
三、 通过IIOP.NET 技术建立的一个系统集成解决方案
1. 建立IIOP.NET开发环境
(1) IIOP.NET下载地址:http://iiop-net.sourceforge.net/index.html;目录结构如图3.1。由于官方网站上只提供了该项目的源文件,故需要下载到本地后,进行手工编译,执行nmake命令,生成dll 文件,供程序引用。(编译前需要拷贝jdk/lib 目录下的ir.idl 和 orb.idl 文件到IIOP.NET的idl目录,编译完成后会在响应的工程文件夹中生成dll文件或exe文件,并加以使用。这里会使用到IIOPChannel.dll,以及IDLToCLSCompiler.exe 两个文件。编译方法参见解压包中的Readme.txt)

图3.1
将Microsoft Visual Studio 安装目录下的 VC\bin,添加到系统环境变量path中;(例如D:\Program Files\Microsoft Visual Studio 9.0\VC\bin)
(2) 编译IDL文件。执行命令 IDLToCLSCompiler hi hi.idl ; 命令执行完后,会生成hi.dll文件,里面为idl文件定义的一些接口。(命令详解网址:http://iiop-net.sourceforge.net/faq.html)
2. IIOP.NET实现客户端
使用IIOP.NET来实现客户端通过4个步骤完成:
(1) 为服务器对象生成IDL 描述;
(2) 使用 IIOP.NET 工具 IDLTOCLSCompiler 从IDL生成代理类;
(3) 注册IIOP.NET 通道;
(4) 使用代理类。
3. IIOP.NET实现服务器端
(1) 定义所需的接口,即IDL文件;
(2) 使用IDLTOCLSCompiler 命令从IDL文件生成代理类。例如IDLTOCLSCompiler ProxyClasses orb.idl ;最终生成ProxyClasses.dll,包含定义类型的代理类,所有文件必须在正确的目录下。
(3) 注册IIOP.NET 通道,连接服务器,访问远程对象,实现.NET  Web 服务。
注册通道并获取对象的引用来配置 Web 服务,程序如下:
Public class Global:System.Web.HttpApplication{
Protected void Appplication_Start (Object sender, EventArgs e){
IiopChannel channel = new IiopChannel();//建立IIOP通道
m_factory=GetFactory(); //代理类
remotingServices.RegisterChannel(channel); //注册IIOP通道
CorbaInit init = CorbaInit.getInit(); //客户端corba初始化
NamingContext nameService =(NamingContext)init.Get- NameService(Host,port); //生成命名服务
NameComponent[] name = new NameComponent[] { new NameComponent("Factory"), //绑定对象,服务
Factory factory=(Factory)nameService.resolve(name);//根据绑定的对象名称,获得对象
……
}
}
(4) 对象实现,提供服务。
四、 IIOP.NET开发深圳医保接口实例
1. IOR文件介绍
Interoperable Object Reference,可互操作对象引用;基于IOR能够实现CORBA对象定位。IOR 是一个数据结构,它提供了关于类型、协议支持和可用 ORB 服务的信息。
2. 编译IDL文件
执行命令IDLTOCLSCompiler  hi  hi.idl,会在IDLTOCLSCompiler.exe 所在目录生成hi.dll 文件。
3. 获取IOR文件
从http://as170.szsi.gov.cn/szsb/hisi.html 获取ior 文件,用于与服务器建立连接。
4. 添加项目引用
建立客户端项目,并添加之前生成的hi.dll 以及 IIOPChannel.dll 引用。
5. 客户端示例程序
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using Ch.Elca.Iiop;
using Ch.Elca.Iiop.Services;
using omg.org.CosNaming;
namespace hi.modMZ
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // 建立并注册IIOP通道,与服务器corba进行通信
                IiopClientChannel channel = new IiopClientChannel();
                ChannelServices.RegisterChannel(channel,false);
                //本地corba初始化
                CorbaInit init = CorbaInit.GetInit();
                //ior文件中内容,也可从ior文件中读取
                string ior = "IOR:000000000000002B49444C3A6F6D672E6F72672F436F734E616D696E672F4E616D696E67436F6E746578744578743A312E300000000000020000000000000078000102000000000F36312E3134342E3235332E3131370000271000000000001F5374616E646172644E532F4E616D655365727665722D504F412F5F726F6F7400000000020000000000000008000000004A414300000000010000001C00000000000100010000000105010001000101090000000105010001000000010000002C0000000000000001000000010000001C00000000000100010000000105010001000101090000000105010001";
               //根据ior字符串获取对方命名服务
               NamingContext nameService = (NamingContext)RemotingServices.Connect(typeof(NamingContext), ior);
              //根据对象绑定的服务名获取远程对象
              NameComponent[] name = new NameComponent[] { new NameComponent("MZYL", "Service") };
                string yljgbm = "H0920";
                string ylzh = "%*************************************************";
                string pass = "";
                string zzyybm = "*****";
                string czybm = "*****";
                string czy = "*****";
                short[] czyxm = transfromSA(czy);
               
                hi.GRXX hr;
               
                intMZ mz = (intMZ) nameService.resolve(name);
                Console.WriteLine();

                //测试方法            
                short[] res = mz.GetGRJBXX(yljgbm, ylzh, pass, czybm, czyxm, out hr);
                Console.WriteLine(TransformAS(res));
                Console.WriteLine(hr.ACCOUNT);
                Console.WriteLine(hr.YLZH);
                Console.WriteLine(hr.XB);
                Console.WriteLine("finished!");
            }
            catch (Exception e)
            {
                Console.WriteLine("exception: " + e);
            }
        }
        //string类型转为short[]
        public static short[] transfromSA(string strArray)
        {
            short[] shortArray = new short[strArray.Length];
            char[] chars = strArray.ToCharArray();
            for (int i = 0; i < strArray.Length;i++ ) {
                shortArray[i] = transCharToShort(chars[i]);
            }
            return shortArray;
        }
       
        public static short transCharToShort(char c) {
            char[] t = new char[1];
            t[0] = c;
            string strTemp = new string(t);
            byte[] cc = System.Text.Encoding.Default.GetBytes(strTemp);
            if (cc.Length == 1)
            {
                return (short)(cc[0] < 0 ? cc[0] + 256 : cc[0]);
            }
            int v1 = cc[0] < 0 ? cc[0] + 256 : cc[0];
            int v2 = cc[1] < 0 ? cc[1] + 256 : cc[1];
            return (short)(v1 * 256 + v2);
        }
        //short[] 转为string类型
        public static string TransformAS(short[] sArray)
        {
            char[] charArray = new char[sArray.Length];
            for (int i = 0; i < sArray.Length; i++)
            {
                charArray[i] = TransShortToChar(sArray[i]);
            }
            return new String(charArray);
        }
        private static char TransShortToChar(short sTemp)
        {
            if (sTemp >= 0)
            {
                return (char)sTemp;
            }

            byte[] b = new byte[2];
            b[0] = (byte)(sTemp >>;
            b[1] = (byte)sTemp;
            string strTemp = System.Text.Encoding.Default.GetString(b);
            char[] charArrTemp = strTemp.ToCharArray();
            return charArrTemp[0];
        }
    }
}

6. 测试输出。
程序正常输出结构体GRXX中的信息,说明能与服务器端正常通讯,进行数据交换。如程序出现异常,一般表现为:
 未能与服务器建立连接(如ior文件错误,或网络连接失败);
 服务名填写错误(如门诊服务名为:"MZYL","Service",一旦服务名填写错误,不能获取服务器端门诊服务对象。)
 本地测试某些方法时,传入的参数为空;
 服务器端某些方法的实现有问题。
五、 结束语
本文通过分析使用.NET应用IIOP.NET开发深圳医保接口的示例,阐释了使用C#开发corba应用程序的流程。通过采用IIOP.NET 能够达到企业级应用系统的无缝集成的要求,IIOP.NET 具有可靠性高,可用性强,紧耦合等特点,并且这个技术是一个开源项目,拥有 LGPL 许可证,因此,它是一种理想的企业级应用工具和应用系统解决方案。
2
1
分享到:
评论
4 楼 wu_zheng_peng 2012-10-12  
如果使用到ADSL ,是不是用到第【3.IIOP.NET实现服务器端 】的编写?
3 楼 wu_zheng_peng 2012-10-12  
您连接服务端是用adsl还是VPN的方式进行连接的?
2 楼 wzhiju 2012-10-10  
用的是IIOPNet.src.1.9.0.final那个包,如何编译你看一下包里的readme.txt 文档,挺详细的
1 楼 wu_zheng_peng 2012-10-05  
您能具体说一下,IIOP.NET是哪个版本吗,如(IIOPNet.src.1.9.0.rc0)? 还有就是nmake命令如何的使用,电脑上需要具备哪些环境吗?

谢谢

相关推荐

    使用IIOP.NET 连接C#与C++程序(基于corba)

    在这个场景中,我们使用IIOP.NET作为C#与C++之间通信的桥梁,IIOP(Internet Inter-ORB Protocol)是CORBA的一种传输协议,它定义了ORB(Object Request Broker)间交换消息的格式。 1. IIOP.NET:IIOP.NET是一个...

    java开发中兴corba接口所需idl文件

    java开发中兴corba接口所需要的中兴idl文件,用于编译生成中兴corba服务端接口 corba开发参考:https://my.oschina.net/dong706/blog?catalog=5757620

    IDL和C#混合开发模板

    在这个场景下,"IDL和C#混合开发模板"是一个专为程序员设计的资源,它可以帮助那些在跨语言环境中工作的开发者,特别是对IDL(Interface Definition Language)和C#有需求的猿友们。 IDL全称为接口定义语言,它是一...

    IDL和C#混合开发模板_ idI c#, idI封装类库c#-C#代码类资源

    在C#与IDL混合开发中,通常会用到MIDL(Microsoft Interface Definition Language)工具,将IDL接口转换为C#可使用的代理类。 2. C#:C#是由微软开发的一种强类型、面向对象的编程语言,支持泛型、委托、事件、属性...

    corba例程

    在本例程中,我们将探讨使用C#和C++这两种不同的编程语言与CORBA进行交互的方法。C#和C++虽然属于不同的编程范式,但通过CORBA,它们可以共享和调用彼此的代码,实现分布式应用。 首先,我们需要了解CORBA的核心...

    C#与IDL混编实例

    2. **编译IDL到C#代理代码**:使用如MIDL(Microsoft Interface Definition Language)这样的工具,将IDL文件转换为C#代码,生成一个可与IDL服务通信的代理类。 3. **实现C#客户端**:在C#项目中引用生成的代理类,...

    CORBA-Example:中间件实验 CORBA

    **中间件实验:CORBA详解** 中间件是计算机软件的一种,它位于...通过这样的实验,我们可以学习到CORBA的基本概念、组件以及它们在实际开发中的应用。理解并熟练掌握这些知识对于构建分布式系统和跨平台应用至关重要。

    c#创建webservice实例

    以前,分布式的应用程序逻辑需要使用分布式的对象模型,通过使用 DCOM、CORBA、RMI 之类的基本结构,开发人员仍可拥有使用本地模型所提供的丰富资源和精确性,并可将服务置于远程系统中。然而,这些系统有一个共同的...

    基于Tao框架的C#中OpenGL建模技术的实现

    Tao框架,全称为Tao Framework,是由美国华盛顿大学分布式对象计算组织开发的一个开源的CORBA(Common Object Request Broker Architecture)产品。尽管其主要目的是实现CORBA 2.6规范,但Tao Framework还提供了一...

    C#调用IDL报错.docx

    在探讨"C#调用IDL开发时因DLL未注册导致的错误及解决方法"这一主题时,我们首先要了解IDL(Interface Definition Language)与C#的基本概念及其间的交互原理,随后逐步解析问题并提供解决方案。 ### 一、IDL简介 ...

    Corba 技术资料

    - **客户端**:在 C# 中实现 Corba 客户端涉及编写代码来创建 ORB 实例,然后使用 IDL 生成的代码来调用远程对象的方法。 - **服务器端**:服务器端需要定义对象接口并通过 IDL 描述,然后实现这些接口以响应客户端...

    三种方式实现java远程调用(rmi),绝对可用

    2. **暴露RMI服务**:使用`&lt;bean&gt;`标签的`rmiRegistryPort`属性暴露RMI服务,Spring会自动处理注册和绑定的过程。 3. **客户端消费**:客户端通过Spring的`RmiProxyFactoryBean`或`RmiClientInterceptor`来创建远程...

    C#入门经典之web服务示例

    在C#中,开发Web服务通常使用ASP.NET框架。开发者可以创建ASP.NET Web服务项目,定义服务接口和实现,然后通过Visual Studio工具进行测试和发布。客户端应用程序可以方便地通过HTTP调用这些Web服务,获取或发送数据...

    CORBA技术在城市轨道交通自动化系统中的应用研究.pdf

    它允许开发者使用自己熟悉的语言来实现CORBA服务和客户端,增强了开发的灵活性。 CORBA技术在城市轨道交通自动化系统中的应用具有以下优势: - 并发访问支持:CORBA技术能够有效处理大量的并发访问请求,这对于...

    c#创建.net下的webservice示例

    - **Visual Studio .NET**:虽然不是必需的,但使用 Visual Studio .NET 可以极大地简化开发过程。 - **文本编辑器**:如果你不打算使用 Visual Studio .NET,也可以使用任何文本编辑器(如 Notepad、WordPad 或 ...

    基于ArcObjects的系统开发技术剖析

    目前,GIS应用开发主要采用以下几种方式:自主设计空间数据结构和数据库,使用编程语言如VC++、VB等开发;引入先进的GIS软件(例如Arc/Info),利用其提供的二次开发工具;利用支持面向对象技术的高级语言和GIS厂商...

    Remoting.Corba-开源

    Remoting.Corba是一个.NET库,它为.NET Remoting系统提供IIOP支持。 这使开发人员可以使用C#和Visual Basic .NET编写与CORBA系统互操作的应用程序,而无需ORB或SOAP / CORBA桥。

    UML开发工具一览表

    Describe版本6.1.6,由Embarcadero公司发布,支持C++、Java、C#、VB、CORBA IDL等多种编程环境。它被称为“IMDE”(集成建模和开发环境),强调双向工程的高质量代码生成,尤其在减少垃圾代码方面表现出色。Describe...

Global site tag (gtag.js) - Google Analytics