最近工作中接触到一个比较老的语言,Power Builder,为了方便实现功能,采用PB调用.NET dll和web service的方法为PB提供新的扩展功能,因为以前从未接触过PB,因此费了些功夫,现将方法记录下来备查。(以下内容均使用PB9)
PB调用.NET dll
1. 生成dll
上图中的源码为
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices; //该引用必须
namespace CallByPB
{
[Guid("717ce1a8-19f0-4af8-bf28-b92dc5fadc63")] //利用GUID生成器随机生成,大家上网查如何生成,必须
public interface CallParamers
{
[DispId(1)]
string PBCall(string para, ref int result);
}
[Guid("80b62040-2d4f-451c-be0e-ccc80f2474eb")] //利用GUID生成器随机生成,大家上网查如何生成,必须
[ClassInterface(ClassInterfaceType.None)]
public class Class1 : CallParamers
{
public string PBCall(string para, ref int result)
{
result = 1234;
char[] tmp = para.ToCharArray();
Array.Reverse(tmp);
return new string(tmp);
}
}
}
注意在生成dll之前,必须在工程属性中选择使程序集com可见,并为com互操作注册,如下图所示。
设置完成后,检查工程Properties中的AssemblyInfo.cs文件,确保[assembly: ComVisible(true)]并保存。接下来就可以生成dll了,注意生成dll时必须用管理员权限打开VS。
2. 注册dll
生成dll后,利用如下命令在命令行中注册dll。注意根据.net framework版本选择合适的命令,如果是.net 2.0,则下面命令中的v4.0.30319换为v2.0.50727。此外,注册时需要用管理员权限打开命令行窗口。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe path\to\your\dll\CallByPB.dll
3. 调用dll
在PB的合适位置添加如下代码
string messages
string test = "asd123"
int flag, returns
OleObject Oleb
Oleb = Create OLEObject
flag = Oleb.ConnectToNewObject("CallByPB.Class1") //CallByPB为C#中命名空间(namespace) ,Class1为C#中类名
if flag <> 0 then
MessageBox("提示","PB调用C#COM组件失败,返回消息")
return
end if
messages =Oleb.PBCall(test, ref returns)
MessageBox("提示", messages+'~n'+string(returns))
运行PB,即可得到调用的结果。注意,如果要发布PB程序,需要将.NET dll复制到PB程序同一目录下,并重新注册。
PB调用Web Service
1. 生成并部署web service
上图中的代码为
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace WebService
{
/// <summary>
/// WebService1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
[WebMethod]
public string test(string para)
{
char[] tmp = para.ToCharArray();
Array.Reverse(tmp);
return new string(tmp);
}
}
}
用VS成功生成后,即可进行部署。部署需要安装IIS服务,可在控制面板添加删除程序中添加windows特性,勾选IIS和对应的.NET运行环境即可安装,此处不再赘述。接下来进行部署
接下来打开IIS管理界面,新建网站
注意要把默认网站关闭,或者修改默认端口,防止端口冲突。完成后,将应用程序池修改为.NET 4.0。
重新启动网站后在浏览器中输入网址,如能看到类似如下网页,则说明部署成功
2. 在PB中生成web service代理
将web service地址填入下图红框处,注意在文件名后面增加了"?wsdl"字样
点击下一步之后,正常情况下会出现下图。但实际上PB9有很多版本,只有9.0.3 build 8836以上的版本才能正常发现Web Service,其他版本可能找不到。PB9.0.3 build 8836的补丁可在如下网址下载:
https://download.csdn.net/download/u014559935/10938422
最终生成一个工程文件如下图所示,右键点击该工程文件,选择Deploy
则可以生成web service代理如下图红框所示,注意生成的时候要把右边所有窗口关掉
接下来即可通过生成的web service代理在代码中合适的地方调用web service。注意需要导入红框中的pbsoapclient90.pbd文件,否则会报错,该文件位于pb安装目录下的Shared\PowerBuilder目录下。
上图中的代码如下
String ls_return
string test = "545758602"
soapconnection lsc_conn
webservicetestwebservice1soap lsrv_obj
lsc_conn = CREATE soapconnection
lsc_conn.createinstance(lsrv_obj,"webservicetestwebservice1soap")
ls_return = lsrv_obj.test(test) // test就是web service中的函数
messagebox("",test + "~n" + ls_return)
导入pbsoapclient90.pbd的方法如下
运行结果如下