连接Corba和dotNet

Corba, 公用对象请求代理程序结构(Common Object Request Broker Architecture)的首字母缩写,在跨平台和跨语言(如J2EE)的分布式(多层)系统通信中具有广泛的应用,将CORBA连接到dotNET(在多层应用中,ASP.NET Web services and .NET Remoting 是其主要应用方式)是不容易的。要连接这两者,就需要一个能将dotNet的object描述成Corba的object,以至于J2EE能使它们交互的方法,同样,也能将Corba的object描述成dotNet的object,让dotNet的code能认识。换句话说,需要一些中间代码能翻译Corba和dotNet FrameWork之间的这些对象和方法调用。Borland的Janeva可以做到这一点。它简化了Corba或J2EE和dotNet之间的处理过程。

Getting Started
在开始之前,你需要有一个Corba Server,尽管有很多读者都有而且在运行,但是还有很多没有,所以,本文第一步就演示如何用C++创建一个简单的Corba Server以练习和测试。要说明的是Corba Server同样可以用Java,Delphi 以及其它语言编写。第二步演示如何利用Janeva连接这个Server。

本例中的Server是用Borland C++Builder 6 Enterprise.创建的。如果没有Borland C++Builder,你可以下载编译过的Server,这个Server是基于一个个人议事日程的系统,用来安排电子会议。这个日程编排的细节对于本文来说不是很重要。重要的是如何你用Janeva连接Servere和Client。

Build a CORBA Server
To build the CORBA server, start C++Builder, click the File | New menu, select Other and go to the Multitier tab of the Object Repository (see Figure 1).

Figure 1. C++Builder Object Repository: The Object Repository contains a list of the items available

Figure 2. CORBA Server Wizard: You use this wizard to specify project options for a new CORBA server project.

A number of icons appear in the dialog related to CORBA. To start a new CORBA server project from scratch, double-click on the CORBA Server icon, which will display the CORBA Server Wizard so you can specify the options for the new project (see Figure 2).

You can choose to create a Console Application (with or without using Borland's Visual Component Library) or a Windows Application. For this project, select the Windows Application option, because it's convenient to have the server display some visual (debug) information during development.

一个Corba服务能包含一个或多个Corba对象,这些Corba对象的接口声明通常都存储在IDL文件中,当新建一个Corba服务时,可以选择一个存在的IDL 文件或者新建一个空IDL文件,然后加入Corba对象的定义,本例中的IDL如下:

module DiarySrv

{

struct DateTime {

long Date; // example: 20030929

long Time; // example: 1200

};

interface ICorbaDiaryServer

{

exception MeetingImpossible

{

string Reason;

};

void Meeting(in wstring Names, in DateTime DayTime, in long Duration)

raises (MeetingImpossible);

};

};

当点击Corba Server的向导OK按钮后,C++Builder会创建一个新的工程,将Form保存为.MainForm.cpp,工程文件保存为BCB6CorbaServer.bpr。在IDE中将DiarySrv.idl加入工程。当你编译这个工程,C++Builder会运行idl2cpp工具,产生4个基于IDL定义的文件,即DiarySrv_c.cpp and DiarySrv_c.hh (for the stub classes,客户端使用) , DiarySrv_s.cpp and DiarySrv_s.hh (for the skeleton classes服务端使用)。

Figure 3. CORBA Object Implementation Wizard: You use this Wizard to specify the IDL file, select interface names, the delegation model, and other properties.

CORBA Object Implementation
分开skeleton和stub,要有一个能实际运行的DiarySrv Corba对象。可以使用向导。(see Figure 1 for the icon in the Object Repository). Click File | NewOther, go to the Multitier tab, and double-click on the CORBA Object Implementation icon, which will display the dialog shown in Figure 3。

对于每一个IDL文件,可以选择所有接口,根据你选择的是delegation model、data module并且是否需要在WinMain中创建一个对象示例,向导会建议你输入单元名、类名等。

点击OK,IDE会产生两个文件ICorbaDiaryServer.cpp,ICorbaDiaryServer.h。这就是写实际运行的Corba Server对象实现的地方。部分代码:

#pragma hdrstop

#include <corba.h>

#include "ICorbaDiaryServerServer.h"

#include "MainForm.h"

//----------------------------------------------------

#pragma package(smart_init)

ICorbaDiaryServerImpl::ICorbaDiaryServerImpl(

const char *object_name):

_sk_DiarySrv::_sk_ICorbaDiaryServer(object_name)

{

if (Form1)

Form1->Caption =

"ICorbaDiaryServer up and running...";

}

void ICorbaDiaryServerImpl::Meeting(

const CORBA::WChar* _Names,

const DiarySrv::DateTime& _DayTime, CORBA::Long

_Duration)

{

if (Form1)

Form1->Memo1->Lines->Add(

"Meeting with " + AnsiString(_Names));

if (_Duration > 60)

throw

DiarySrv::ICorbaDiaryServer::MeetingImpossible(

"I don't like long meetings...");

}

Figure 4 shows the running application.

Figure 4. The Running CORBA Server: Here's a screenshot of the completed CORBA server.

注意检查会议时间的代码,如果会议持续时间超过一个小时,会抛出一个错误信息:"I don't like long meetings.",很显然,这个异常纯粹是演示Corba异常,以及C#客户端接受并回应这个错误。

在运行Corba Server之前,要保证VisiBroker在运行状态。

Build a CORBA Client
我已经用C#builder创建了一个dotNet Corba的客户端,但理论上来说,任何dotNet语言都是可以的。Start C#Builder Enterprise or Architect, and create a new C# application. In the New Application dialog you can specify the name as well as the location of the new project (see Figure 5).

Borland Janeva 1.0
Borland Janeva 可以让Microsoft .NET Framework 应用和J2EE/CORBA server 对象无缝结合并高效集成。C#Builder的企业版和架构版都带有Janeva,你也可以到Borland网站上下载(和其它dotNet 开发环境结合,详细信息参见本文结尾)。

Figure 6. Add CORBA Reference: Janeva adds two items to the Add References menu, letting you select J2EE or CORBA references as well as standard file or Web references.

在免费注册后,你可以得到一个用来测试的licence。但是,如果你要分发.Net客户端,则需要购买分发licence。

安装完Janeva,你就可以右击C#builder中的工程文件,增加一个J2EE或Corba引用(见图6),没有Janeva,你只能增加普通接口或Web reference。

因为本例是Corba server,选择增加Corba引用,将会显示一个对话框,可以选择Corba服务定义的IDL文件。如图7。

Corba Server应用发布“接口”定义是通过IDL文件,支持Corba客户端应用的开发环境通常都支持将IDL转化为计算机语言,如C++、java,然而对于dotNet客户端,必须要将IDL转化为dotNet语言,如VB.NET 或c#,IDL-to-C#(IDL2CS)是Borland Janeva最受欢迎的特征。

Figure 7. Adding a CORBA Reference: Browse to the location of the DiarySrv.idl file to add the reference.

注意,尽管你导入了Corba Server的定义,但是你还没有指明如何连接它。

添加了IDL文件后,Janeva导入并编译IDL文件,产生一个相应的CS文件(DiarySvr.cs)。

"Figure 8. Manual Janeva Compile: If you need to alter an IDL file after adding it, right-click the file in Project Manager and select Janeva Compile from the context menu.

如果将来你要改变IDL文件,可以在工程管理器中右击IDL文件(如图8)选择重新编译。

要使用DiarySrv.cs,在using中增加Corba命名空间和产生的DiarySrv命名空间。

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using CORBA;

using DiarySrv;

在WinForm的构造函数中,创建ORB(对象请求代理)的实例,来连接客户端和服务端。要做到这样,利用vbroker代理端口和14000参数(visibroker默认端口-译者注)调用CORBA.ORB.Init即可。

我使用的是默认的14000端口,你可以使用另外的端口,端口的配置相信信息请参见Corba ORB的文档。

string[] args = new string[]

{"-vbroker.agent.port", "14000"};

orb = CORBA.ORB.Init(args);

Calling the CORBA Server
配置完客户端程序后,可以利用一个按钮来创建Corba DiarySrv对象的实例。然后调用Meeting方法。

private void button1_Click(object sender,

System.EventArgs e)

{

try

{

MyCorbaDiaryServer =

ICorbaDiaryServerHelper.Bind(

"ICorbaDiaryServerObject");

DiarySrv.DateTime MyDateTime = new

DiarySrv.DateTime();

MyDateTime.Date =

Convert.ToInt32(textBox2.Text);

MyDateTime.Time =

Convert.ToInt32(textBox3.Text);

MyCorbaDiaryServer.Meeting(textBox1.Text,

MyDateTime, Convert.ToInt32(textBox4.Text));

}

catch

(DiarySrv.ICorbaDiaryServerNS.MeetingImpossible

ex)

{

MessageBox.Show(ex.Reason, "CORBA Exception");

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "Error");

}

}

对照代码,可以发现:

首先,必须通过正确的名字(在Corba服务端创建Corba Diary 服务对象时指定的,本例中为ICorbaDiaryServerObject)调用绑定方法。

绑定完Corba服务器端对象后,才能调用Meeting方法。但是不要没有检索Date和Time,并构造特殊的DiarySrv.DateTime(IDL文件和Corba服务端实现的类型) 对象。

Figure 9. C#Builder CORBA Client: The figure shows the main window for the completed CORBA client running.

代码还包含了4个Label和TextBox控件,用来让最终用户输入Meeting方法需要的名称,日期,时间,持续时间等信息。在运行阶段,应用程序效果如图9

注意,持续时间设定为61分钟,仅仅是让Corba客户端抛出异常(如图10)。

Figure 10. CORBA Exception: A MessageBox display of an exception received by the C#Builder CORBA client.

只有将时间限制在60分钟内。就可以安全的增加会议安排到议事日程中。

你在这里所看到的就是Janeva作为所谓的在Corba server和dotNetClient间的企业应用 集成(EAI)层。这项技术的主要优点就是你可以不需重写或修改已经存在的Corba服务就可以连接dotNet应用。

―――――――――――――――――――――――――――――――――――

第一次翻译,请指正。

时间: 2024-10-30 18:21:28

连接Corba和dotNet的相关文章

java corba连接T2000网管

问题描述 当我用corba连接T2000网管,在执行到objRef=orb.resolve_initial_references("NameService");namingContext=NamingContextHelper.narrow(objRef);获取名字服务时上报java.nio.channels.UnresolvedAddressException.求大牛指导....谢谢 解决方案 解决方案二:看不懂啊,顶

通过CORBA连接OMC提示这个错误,诺西的

问题描述 通过CORBA连接OMC提示这个错误,诺西的 通过CORBA连接OMC提示这个错误,WARNING: "IOP00100007: (BAD_PARAM) string_to_object conversion failed due to bad scheme name" org.omg.CORBA.BAD_PARAM: vmcid: OMG minor code: 7 completed: No,请问大神们,这个问题怎么解决啊! 解决方案 你传递的参数语法等不对吧.

DotNet开发中关于SQLServer连接的两种方法之比较

      在.net中关于SQL Server有两种打开连接的方式,一种是在System.Data.SqlClient命名空间下,相信很多人都是用这里面的方法进行编程的,还有一种是在Microsoft.ApplicationBlocks.Data.SqlHelper命名空间下,方法大致相同,为什么会有两个不同的空间提供相似的功能呢?     微软在推出.net体系时默认附带了System和Microsoft两个命名空间,Microsoft命名空间正是System命名空间的有力补充,即以当前讨论

DotNET企业架构应用实践-企业管理软件架构(计算)的历史与发展(上)

         企业管理软件是计算机软件应用的一个重要领域,在今天计算机软件除面向科学计算之外应用最广阔的也是企业管理应用,可以说计算机技术的发展推动着企业应用发展,企业管理需要也一方面影响着计算机技术的发展,今天,在我们的周末,企业管理应用软件开发人员占了总开发人员中的极大的比例.          今天我们就来通过回顾计算技术在企业应用中的发展历程来看看软件架构的发展. 主机-字符终端          在PC机没现世之前,极小数的企业使用大型业务处理主机处理企业计算机任务,在那个时候,计

DotNet 资源大全

原文:DotNet 资源大全 转自:http://blog.jobbole.com/96676/ API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台. ASP.NET WebAPI:快捷创建 HTTP 服务的框架,可以广泛用于多种不同的客户端,包括浏览器和移动设备. ServiceStack :架构缜密.速度飞快.令人愉悦的 web 服务. Nelibur:Nelibur 是一个使用纯 WCF 构建的基于消息

DotNet 资源大全中文版

原文:DotNet 资源大全中文版 转自:https://github.com/jobbole/awesome-dotnet-cn 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-dotnet 是由 quozd 发起和维护.内容包括:编译器.压缩.应用框架.应用模板.加密.数据库.反编译.IDE.日志.风格指南等. Awesome 系列虽然挺全,但基本只对收录的资源做了极为简要的介绍,如果有更详细的中文介绍,对相应开发者的帮助会更大.这

在VB.net中连接MySql的类库

这是在VB.net中为连接MySql中编写的一个类库.你可以使用这个类库直接操作MySql数据库. 在使用这个类库之前,你必须安装 ODBC MYSQL 3.51下载地址:http://www.mysql.com/downloads/api-myodbc-3.51.html Driver ODBC.NET下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyId=6CCD8427-1017-4F33-A062-D165078E32B

用JAVA开发CORBA应用实例

应用实例 文章摘要: 通用对象代理体系结构CORBA(Common Object Request Broker Architecture)是对象管理组织所定义的用来实现现今大量硬件.软件之间互操作的解决方案,CORBA也是迈向面向对象标准化和互操作的重要一步. -------------------------------------------------------------------------------- 正文: 用JAVA开发CORBA应用实例 通用对象代理体系结构CORBA(C

一个简单的 CORBA/java 示例

示例 6 月份,我们谈过您为什么要使用 CORBA 和 Java 技术.本月,我要通过一个可用的简单示例,让您开始探索 CORBA 技术的许多领域.不过,别忘了我们的目标是,创建这样一种分布式应用程序:使驻留在一台计算机上的客户机能向运行于另一台计算机上的服务发出请求.我们不想为诸如硬件或操作系统软件等细节问题操心,而只是想让这种服务能响应客户机的请求. IDL 接口 全部 CORBA 结构是从一个接口开始的,理解接口的最佳方法就是想像我的汽车,对,我的汽车.虽然您不熟悉它,但如果我对您说:"开