PB9調用.net dll和web service

最近工作中接觸到一個比較老的語言,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/k782574/10592517?utm_source=bbsseo

最終生成一個工程文件如下圖所示,右鍵點擊該工程文件,選擇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)

運行結果如下

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章