PB 调用.NET COM组件

 

今天需要作一下pb引用.net的外接程序类。反复测试都没有成功。看到这篇文章解决了我的问题。在此感谢。综合我的碰壁经验。需要注意以下两点。

1..net项目需要勾选生成 com组件。

2.在类名前加上标识。

以下是对原文章的转载:

http://blog.sina.com.cn/s/blog_53d716150100kp2k.html

****************************************************************

对于现在使用PB和.NET同时开发的项目,现在.NET已经有的功能,想在PB下调用,只能把.NET做成COM组件,再在PB中调用。

方法如下:

   一.在.NET中新建类库

   二.注册类库

   三.在PB中调用

下面详细介绍一下:以.NET2005和PB11.5为例

一、在.NET中新建类库

  1.打开Microsoft Visual Studio 2005

2.新建类库项目:点文件-->新建-->项目,在打开窗口选择类库

PB <wbr>调用.NET <wbr>COM组件
 

3.添加代码:

新建后出现一个Class1.cs的类库文件,打开,修改成代码如下:

using System;

using System.Collections.Generic;

using System.Text; 

namespace demo

{

    public class Class1

    {

        public int AddTenToParameter(int param1)

        {

            return param1 + 10;

        }

         public void SayHi()

        {

            System.Windows.Forms.MessageBox.Show("Hello World!");

        }

         public String GiveMeDate()

        {

            return DateTime.Now.ToLongDateString();

        }

    }

}

   4.添加引入,因为MessageBox需要Form组件。

PB <wbr>调用.NET <wbr>COM组件

5.修改项目属性,点项目,右键,选属性。

PB <wbr>调用.NET <wbr>COM组件

在“生成”TAB属性页中选中“为COM Iterop注册

PB <wbr>调用.NET <wbr>COM组件

6.在Class1.cs中增加引入

using System.Runtime.InteropServices;

7.增加下面属性到类【注意 regasm 要加上参数/codebase,否则导致客户机不能正确调用到dll

[ComVisible(true)] [ClassInterface(ClassInterfaceType.AutoDual)] [ProgId("demo.Class1")]
现在类库就完成了,可以编译使用了。如要修改ProgId可以在AssemblyInfo.cs 进行修改。
二.注册类库
使用regasm进行注册
命令如下:regasm /codebase demo.dll /tlb:demo.tlb

 三.在PB中调用

   在程序中用以下代码

int return_code 

return_code = example.ConnectToNewObject("demo.Class1")

if return_code <> 0 then

       destroy example

       messagebox('错误','打开OLE出错!')

       return

else

       example.sayhi()

       int v = 20

       messagebox('result',v)

       string s

       s = example.givemedate()

       messagebox('result',s)

end if

现在就完成了在PB中调用.NET组件的工作。

在c# 2005中编写com组件,供PB11调用实例,研究了一下午,终于成功了,分享给大家 前言:c#中写的dll直接是不能被pb调用的,只有写成com组件才可以调用,所以用c#写dll时要注意。 1、c#2005中新建项目,类型为类库,项目名为AddCom确定。   配置:右键点击解决方案资源管理器中的AddCom,选择“属性”,选择“生成”,选择“为COM Interop注册(_P)” 2、打开AssemblyInfo.cs文件,设置[assembly: ComVisible(true)],如果不改则不能被其他程序调用 3、编写com组件会用到guid(全球唯一ID),编写com组件必须要用到。c#会默认生成一个放在AssemblyInfo.cs,如没有生成,网上下一个生成guid的软件,有很多呢。 4、c#中源代码如下,按如下方法编写代码后生成工程,/bin/release中得到AddCom.dll。 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; } } } 5、dos下利用 e:\regasm AddCom.dll 命令注册com组件,可以理解为非.net平台下的regsvr32注册dll组件。提示注册成功即可。 6、pb11中利用ole调用调用com组件,注意,此com组件无法用create ole control的browse查看到,只能利用如下的方法直接动态调用。 integer li_a,li_b,li_total //----------注册c#生成的com组件------------ OleObject ole_AddCom ole_AddCom = Create OLEObject li_rc = ole_AddCom.ConnectToNewObject("AddCom.AddComService") //AddCom为c#中namespace,AddComService为c#中namespace中的class if li_rc <> 0 then MessageBox("ConnectToNewObject", string(li_rc) ) return end if //----------调用com组件中的函数-------------- li_total = ole_AddCom.iadd(li_a, li_b) //iadd为c#中namespace(AddCom为c)中class(AddComService为c)中的函数(iadd()) 完毕 *以上为个人经验,欢迎大家发邮件沟通。 email: kair-china@vip.sina.com qq: 55092518
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值