在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()]
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 = ;
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)要放在工程的根目录下,且这几个文件要放在同一目录下

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

  1. PB调用C#编写的DLL

    C#以其简单易用,功能强大深受大家喜爱.PowerBuilder作为C/S的MIS开发工具,十分简单灵活,开发时间短,开发及维护成本低,一直是中小企业信息管理系统的首选开发工具.但是PB的局限性限制了 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Python面向对象 | 类方法 classmethod

      类方法:必须通过类的调用,而且此方法的意义:就是对类里面的变量或者方法进行修改添加. 例一个商店,店庆全场八折,代码怎么写呢? class Goods: __discount = 0.8 # 折扣 ...

  2. 【JZOJ5740】【20190706】幻想世界

    题目 小 $\omega $ 想要进行烟火表演,她一开始有\(n\)颗彗星和\(n\)颗陨石 如果小 \(\omega\) 有\(i\)颗彗星而没有陨石,那么她会消耗\(i\)颗彗星并得到\(a_i\ ...

  3. top命令输出解释以及load average 详解及排查思路

    原地址: https://blog.csdn.net/zhangchenglikecc/article/details/52103737 1.top输出以及load average 详解 昨天nagi ...

  4. Adobe Audition cc 修改音频 --- 淡出、淡入,合并、裁剪

    ​1.导入音频到Adobe Audition cc中支持多个音频操作 也可以使用鼠标把音频放入其中 2.淡出淡入: 红色圈中的就是淡出淡入的控制符 左手按住ctrl 或者 shift 键  右手按住鼠 ...

  5. JVM一些问题

    1. 类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,他们的执行顺序 答:先静态.先父后子. 先静态:父静态 > 子静态 优先级:父类 > 子类 静态代码块 ...

  6. [转帖]Kubernetes的部署策略

    Kubernetes的部署策略,你常用哪种? https://www.sohu.com/a/318731931_100159565?spm=smpc.author.fd-d.78.1574127778 ...

  7. Java多线程编程(2)--多线程编程中的挑战

    一.串行.并发和并行   为了更清楚地解释这三个概念,我们来举一个例子.假设我们有A.B.C三项工作要做,那么我们有以下三种方式来完成这些工作:   第一种方式,先开始做工作A,完成之后再开始做工作B ...

  8. Matlab的solve()函数的使用方法

    Matlab的solve()函数的使用方法 1.首先是对方程的求解 不废话直接上例子 syms x: eq=x^2+2*x+1; s=solve(eq,x); 结果如下 完美的算出了方程的解 现在对上 ...

  9. .net(2)

    11.interface是否可继承interface?abstract class 是否可实现interface 回答1:接口可以继承接口,而且可以继承多个接口,用“,”进行分割,接口不允许直接或间接 ...

  10. 爬虫基础 之 urllib

    一.urllib 1. 访问 urllib.request.urlopen() 参数: url:需要爬取的URL地址 timeout:设置等待时间,指定时间内未得到相应时抛出异常 # 导入模块 imp ...