PB调用C#编写的Dll类库

在c# 中编写com组件,供PB调用实例

前言:c#中写的dll直接是不能被pb调用的,只有写成com组件才可以调用,所以用c#写dll时要注意。

c#中新建类库

  类库类型为通用类库,项目名为AddCom

1、配置:右键点击解决方案资源管理器中的AddCom,选择“属性”,选择“应用程序”->“程序集信息”,勾选“使程序集COM可见”,然后点击“生成”,选择“为COM互操作注册”

2、打开AssemblyInfo.cs文件,设置[assembly: ComVisible(true)],如果不改则不能被其他程序调用

3、编写com组件会用到guid(全球唯一ID),编写com组件必须要用到。c#会默认生成一个放在AssemblyInfo.cs,如没有生成,可以用GUID生成器生成,也可以网上下一个生成guid的软件

4、c#中源代码如下

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace AddCom
{
    [Guid("298D881C-E2A3-4638-B872-73EADE25511C")]
    public interface AddComInterface
    {
        [DispId(1)]
        int iadd(int a, int b);
    }
    [Guid("2C5B7580-4038-4d90-BABD-8B83FCE5A467")]
    [ClassInterface(ClassInterfaceType.None)]

    public class AddComService : AddComInterface
    {
        public AddComService()
        {
        }
        public int iadd(int a, int b)
        {
            int c = 0;
            c = a + b;
            return c;
        }
    }
}

至此,关于C#的Dll已经操作完成,下面开始注册

注册DLL

注册有两种方法

1、C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe E:\Test\MyLib.dll /tlb: E:\Test\MyLib.tlb

反注册:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe /u E:\Test\MyLib.dll /tlb: E:\Test\MyLib.tlb

(   这个地址是安装Framework的物理地址,根据自己电脑不同进行修改)得到下面图所示即成功注册

2、run("regasm MyLib.dll /tlb: MyLib.tlb",minimized!)

前提是把regasm.exe文件复制到当前项目中

PB调用DLL

pb中利用ole调用来调用com组件

OLEObject OLEObject
long li_status
int li_reg
int li_cel

string a = "aa"
string b = "bb"

//创建OLEObject对象
OLEObject = Create OLEObject
//创建连接
li_status= OLEObject.ConnectToNewObject("RakbLibrary.Class1")

if li_status<>0 then

    //连接不成功,先反注册组件,再重新注册组件
    li_cel = run("regasm /u RakbLibrary.dll /tlb:RakbLibrary.tlb",minimized!)
    if li_cel <> 1 then
        messagebox(‘提示‘,‘反注册失败!‘)
        return

    else
        messagebox(‘提示‘,‘反注册成功!‘)

        li_reg = run("regasm RakbLibrary.dll /tlb:RakbLibrary.tlb",minimized!)
        if li_reg<>1 then
            messagebox(‘提示‘,‘组件注册失败!‘)
            return
        else
            messagebox(‘提示‘,‘组件注册成功!‘)
        end if
    end if
else
    //调用类内的公共函数
 li_res = OLEObject.getForm(a,b)
end if
//释放资源
OLEObject.DisConnectObject()

如果返回值是-3 ,Object could not be created   生成exe执行文件就好了

注意:li_status 连接状态是0则说明连接DLL成功,否则可能就是DLL没有注册成功,需要重新注册一下(注册是时候最好先反注册一下)

   li_cel 注册状态为1则说明注册成功 

OLEObject.DisConnectObject()释放资源要放在调用DLL类库的函数之后,否则会接收不到该函数的返回值

  所有需要的文件(C#的dll文件和tlb文件,regasm.exe)要放在工程的根目录下,且这几个文件要放在同一目录下

原文地址:https://www.cnblogs.com/zxf100/p/10988107.html

时间: 2024-08-28 23:19:39

PB调用C#编写的Dll类库的相关文章

PB调用C#编写的DLL

C#以其简单易用,功能强大深受大家喜爱.PowerBuilder作为C/S的MIS开发工具,十分简单灵活,开发时间短,开发及维护成本低,一直是中小企业信息管理系统的首选开发工具.但是PB的局限性限制了它进一步的发展,这个就不多说了,玩PB的朋友都清楚.PB如何调用C#写的DLL,这个兴趣一上来,就忍不住要解决它.经过多方查找资料加上自己写代码测试,算是解决这个难题.下面列出开发步骤及各种设置选项(开发工具VS2008SP1+PB9.0-8836) 首先我们打开VS2008,新建一个项目,如图 接

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

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

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

1.注意事项:在编写C#DLL类库时,最好不要出现相同的命名空间,否则在C++中调用可能会出现编译错误.2.将C#的源码生成的"dll"文件复制到C++项目中的Debug目录下3.将C++项目属性设置为公共语言运行时支持4.在项目中导入dll文件和引用民命空间 #using "../debug/xxx.dll" using namespace xxxx; 5.实例化C#对象:CL ^cl = gcnew CL(); 6.调用C#带out string[] 参数的方法

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

C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C#中使用这三个函数. [DllImport("Kernel32")] public static extern int GetProcAddress(int handle, String funcname); [DllImport("Kernel32")] public

vb做界面调用c编写的dll

没有真正的做过C++项目,如何在短时间内完成模型软件的方法,成为前段时间需要考虑的问题,通过vbs脚本到vb到gis一直到如今的建模软件,我想到用比较容易上手的吧vb来做界面,(网上有的一些前辈也是这么应用采纳的,极大的肯定了我的方向),核心计算部分用的是c编写的dll,计算引擎直接利用epanet,数据库上打算先放置一边,留着后续升级的时候进行采用,因为定位的是一种辅助调度分析的工具,因此想着先运行起来. vb环境:VB6.0(企业版) C开发环境:DEV C++ 数据库:SQL2008 vb

Delphi7调用DelphiXE编写的DLL问题

http://bbs.csdn.net/topics/380045353 用DelphiXE在WIN2008下编写一个访问WebServices的DLL ws.dll,只有一个输出函数,如下: function Login(URL:PAnsiChar; UserName: PAnsiChar; UserPass: PAnsiChar; LocalLogin: Boolean):PAnsiChar;var   tStr:String;begin try            Result := P

C#调用C++编写的dll

界面还是C#写的方便点,主要是有一个可视化的编辑器,不想画太多的时间在界面上.但是自己又对C++了解的多一些,所以在需要一个良好的界面的情况下,使用C++来写代码逻辑,将其编译成一个dll,然后用C#写界面, 1.C++编写的dll代码如下: extern "C" __declspec(dllexport) int testAdd(int a,int b) { return a+b; } //一个简单测试字符类型的例子 extern "C" __declspec(d

sql server存储过程调用C#编写的DLL文件

新建C#类库,编译. 添加引用 using Microsoft.SqlServer.Server; 方法 [SqlFunction] public static int GenerateTxt() { ...... } 修改数据库配置 ---修改配置 exec sp_configure 'clr enabled', 1; reconfigure; 根据dll路径注册程序集 --从dll中抽取中间语言(IL) USE erp303_szzb_szpa CREATE ASSEMBLY Custome

Java中调用Delphi编写的DLL

有些时候,要写一些程序,在 JAVA 里面好难实现, 但如果使用其它编程语言却又比较容易时,我们不妨通过 JNI 来让不同语言的程序共同完成. JNI 的教程, 网上 C 的比较多,Java 也提供了 javah.exe 为 C 语言的 JNI 程序生成头文件, 如果你是一个 Delphi 编程员, 能否让 JAVA 与 Delphi 程序交互呢? 答案是肯定的,今天我们就来看一下一个简单的例子. Helloworld. 主要是来认识一下, JAVA 怎样调用 Delphi 程序的方法. 好的,