最近工做中接觸到一個比較老的語言,Power Builder,爲了方便實現功能,採用PB調用.NET dll和web service的方法爲PB提供新的擴展功能,由於之前從未接觸過PB,所以費了些功夫,現將方法記錄下來備查。(如下內容均使用PB9)web
1. 生成dllwindows
上圖中的源碼爲瀏覽器
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互操做註冊,以下圖所示。bash
設置完成後,檢查工程Properties中的AssemblyInfo.cs文件,確保[assembly: ComVisible(true)]並保存。接下來就能夠生成dll了,注意生成dll時必須用管理員權限打開VS。函數
2. 註冊dll網站
生成dll後,利用以下命令在命令行中註冊dll。注意根據.net framework版本選擇合適的命令,若是是.net 2.0,則下面命令中的v4.0.30319換爲v2.0.50727。此外,註冊時須要用管理員權限打開命令行窗口。ui
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe path\to\your\dll\CallByPB.dll
3. 調用dllspa
在PB的合適位置添加以下代碼.net
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程序同一目錄下,並從新註冊。命令行
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的方法以下
運行結果以下