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)要放在工程的根目錄下,且這幾個文件要放在同一目錄下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM