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

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

PB调用C#编写的DLL的更多相关文章

  1. PB调用C#编写的Dll类库

    在c# 中编写com组件,供PB调用实例 前言:c#中写的dll直接是不能被pb调用的,只有写成com组件才可以调用,所以用c#写dll时要注意. c#中新建类库 类库类型为通用类库,项目名为AddC ...

  2. C#调用C++编写的DLL函数, 以及各种类型的参数传递 (转载)

        C#调用C++编写的DLL函数, 以及各种类型的参数传递 1. 如果函数只有传入参数,比如: C/C++ Code Copy Code To Clipboard //C++中的输出函数 int ...

  3. C#动态调用C++编写的DLL函数

    C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C ...

  4. 使用clr 调用C#编写的dll中的方法的全解释

    使用clr 调用C#编写的dll中的方法的全解释1.数据库初始化:将下面这段代码直接在运行就可以初始化数据库了exec sp_configure 'show advanced options', '1 ...

  5. 通过C#去调用C++编写的DLL

    这个问题缠了我2个小时才弄出来,其实很简单.当对方提供一个dll给你使用时,你需要去了解这个dll 是由什么语言写的,怎么编译的,看它的编译类型.这样即使在没有头绪时,你可以先尝使用一些比较热门的编译 ...

  6. C++项目中采用CLR的方式调用C#编写的dll

    1.注意事项:在编写C#DLL类库时,最好不要出现相同的命名空间,否则在C++中调用可能会出现编译错误.2.将C#的源码生成的“dll”文件复制到C++项目中的Debug目录下3.将C++项目属性设置 ...

  7. Delphi7调用DelphiXE编写的DLL问题

    http://bbs.csdn.net/topics/380045353 用DelphiXE在WIN2008下编写一个访问WebServices的DLL ws.dll,只有一个输出函数,如下: fun ...

  8. C#调用C++编写的dll

    界面还是C#写的方便点,主要是有一个可视化的编辑器,不想画太多的时间在界面上.但是自己又对C++了解的多一些,所以在需要一个良好的界面的情况下,使用C++来写代码逻辑,将其编译成一个dll,然后用C# ...

  9. Delphi 调用C# 编写的DLL方法

    近来,因工作需要,必须解决Delphi写的主程序调用C#写的dll的问题.在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行:    编写C#dll的方法都一样,首先在vs2005中创建一个“ ...

随机推荐

  1. 神马是代码简单的cmd模式,这就是!

    小狼正在研究 “怎么查找连在一起的同色方块?”算法问题 ,突然感觉我是不是需要一种开发模式,不然感觉自己的代码好乱的. 可能是研究算法吧,导致小狼的思路特别清晰,加上也用了差不多1年的nodejs.s ...

  2. RMQ、POJ3264

    这里说几篇博客,建议从上到下看 https://blog.csdn.net/qq_31759205/article/details/75008659 https://blog.csdn.net/sgh ...

  3. Java中使用nextLine(); 没有输入就自动跳过的问题

    转自:https://www.cnblogs.com/1020182600HENG/p/6564795.html [问题分析] 必要的知识:in.nextLine();不能放在in.nextInt() ...

  4. offset、client、scroll、screen的自己理解

    body是DOM对象里的body子节点,即 <body> 标签: documentElement 是整个节点树的根节点root,即<html> 标签: window.scree ...

  5. Linux下Tomcat如何传入'$'符号

    在实际的工作中,有同事有需求要在Tomcat的启动脚本中添加启动参数,而且启动参数中带有特殊的字符'$',在实际的应用程序中,使用System.getProperty()进行获取设置的值,但是这个字符 ...

  6. linux命令行下的操作的快捷键

    历史相关命令 命令                   含义!!                      执行上一条命令!num                 执行历史命令中的第num条命令!-n ...

  7. unity烘焙记录

    1.Unity Android 阴影不显示.阴影显示不正确 解决 http://blog.csdn.net/xuetao0605/article/details/50626181 2.阴影强度问题 不 ...

  8. PHP一维数组去重方法array_unique()

    array_unique() :去除数组中的重复项,只适用于一维数组 它不像 sort()方法, eg:  $arraytest = array('tommy','tommy','abcd'); so ...

  9. 【Ubuntu】ubuntu 16.04 设置root用户初始密码

    安装ubuntu成功后,都是普通用户权限,并没有最高root权限,如果需要使用root权限的时候,通常都会在命令前面加上 sudo . 我们一般使用su命令来直接切换到root用户的,但是如果没有给r ...

  10. tomcat和应用集成

    将tomcat作为应用的一部分集成到应用中,使得应用可以直接开启http服务,对外提供接口.此时应用程序不必再遵守j2ee中的文件目录格式要求. 此种方式改变了以往先部署tomcat容器,再按照j2e ...