• 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的话,会出现下面的画面

    至此,程序结束.可以跟大家共同参考,学习.

  • 相关阅读:
    阻塞队列之LinkedTransferQueue
    BlockingQueue drainTo()
    jedis常用API
    在Redis集群中使用pipeline批量插入
    序列化
    springmvc单文件上传
    hibernateValidate
    springmvc使用spring自带日期类型验证
    springmvc自定义日期编辑器
    springmvc__SimpleUrlHandlerMapping(对访问地址进行加工,以键值对的形式)
  • 原文地址:https://www.cnblogs.com/eric_ibm/p/dll.html
Copyright © 2020-2023  润新知