PB調用C#編寫的DLL


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的話,會出現下面的畫面

至此,程序結束.可以跟大家共同參考,學習.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM