C#以其簡單易用,功能強大深受大家喜愛.PowerBuilder作為C/S的MIS開發工具,十分簡單靈活,開發時間短,開發及維護成本低,一直是中小企業信息管理系統的首選開發工具.但是PB的局限性限制了它進一步的發展,這個就不多說了,玩PB的朋友都清楚.PB如何調用C#寫的DLL,這個興趣一上來,就忍不住要解決它.經過多方查找資料加上自己寫代碼測試,算是解決這個難題.下面列出開發步驟及各種設置選項(開發工具VS2008SP1+PB9.0-8836)
首先我們打開VS2008,新建一個項目,如圖
接着我們雙擊解決方案下面的屬性文件夾[Properties],系統將打開類型的屬性設置窗口,選擇[應用程序]
點擊程序集信息按鈕,彈出信息窗口,選中[使程序集COM可見],如圖
接下來選擇[生成]標簽 ,選中[為COM互操作注冊]
選擇[簽名]標簽,選中[為程序集簽名]-->[選擇強名稱密鑰文件]-->[新建],輸入你的密鑰名稱,去掉[使用密碼保護密鑰文件],如圖
OK,到這里配置完成,下面給出代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Security.Cryptography;
using System.IO;
using System.Web.SessionState;
using System.Runtime.InteropServices;
namespace encry
{
[Guid("FF6B4D57-F34E-49ec-9A3B-D0A17B59F78A")]
public interface IEncryption
{
[DispId(1)]
string EncryptString(string encryptString, string encryptKey);
[DispId(2)]
string DecryptString(string decryptString, string decryptKey);
[DispId(3)]
string md5(string str, int code);
}
[Guid("531D2D13-11DE-41a8-A788-CB51B5642CCE"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IEncryption))]
public class encryption : IEncryption
{
#region "3des加密字符串"
/// <summary>
/// DES加密字符串
/// </summary>
/// <param name="encryptString">待加密的字符串</param>
/// <param name="encryptKey">加密密鑰,要求為8位</param>
/// <returns>加密成功返回加密后的字符串,失敗返回源串</returns>
public string EncryptString(string encryptString, string encryptKey)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
byte[] rgbIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
catch
{
return encryptString;
}
}
#endregion
#region "3des解密字符串"
/// <summary>
/// DES解密字符串
/// </summary>
/// <param name="decryptString">待解密的字符串</param>
/// <param name="decryptKey">解密密鑰,要求為8位,和加密密鑰相同</param>
/// <returns>解密成功返回解密后的字符串,失敗返源串</returns>
public string DecryptString(string decryptString, string decryptKey)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey.Substring(0, 8));
byte[] rgbIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
byte[] inputByteArray = Convert.FromBase64String(decryptString);
DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
catch
{
return decryptString;
}
}
#endregion
#region "MD5加密"
/// <summary>
/// MD5加密
/// </summary>
/// <param name="str">加密字符</param>
/// <param name="code">加密位數16/32</param>
/// <returns></returns>
public string md5(string str, int code)
{
string strEncrypt = string.Empty;
if (code == 16)
{
strEncrypt = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").Substring(8, 16);
}
if (code == 32)
{
strEncrypt = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5");
}
return strEncrypt;
}
#endregion
}
}
生成一下,在你的程序目錄下面bin文件夾下有一個debug文件夾,生成的DLL就在里面.這個時候pb還不能調用這個DLL.
在這里說明一下,代碼里面的GUID是怎樣生成的.
打開你的VS2008命令提示,如圖
輸入[guidgen],按下回車
選着選項4,注冊格式,點擊[New GUID],將生成新的序列號,點擊[Copy]復制序列號,粘貼的時候記得將前后的花括號去掉
要想pb能夠調用這個DLL,關鍵在於要注冊這個DLL,注冊過程如下,打開VS2008命令提示,打開你的DLL所在的路徑,然后輸入如下命令
regasm 你的DLL名稱.DLL /tlb:你的DLL名稱.tlb,看圖
如果成功注冊將會出現上面的畫面.
接上來是我們PB如何調用這個DLL了.看下圖(調用方式為OLE)

增加一個實例變量
OLEObject encryption
在窗體的Open()事件里面寫下以下代碼
encryption = Create OLEObject
encryption.ConnectToNewObject("encry.encryption")
"encry" 是你C#寫的DLL的命名空間的名稱
"encryption"是你的DLL的類名稱.別搞錯了.
在[執行MD5加密]的按鈕腳本寫如下代碼
long ll_status
string ls_text
string ls_dotext
ls_text = sle_1.Text
ls_dotext = encryption.md5(ls_text,32)
sle_2.Text = ls_dotext
如果一切OK的話,會出現下面的畫面
至此,程序結束.可以跟大家共同參考,學習.