C#写的dll跨语言调用

来源:互联网 发布:青岛易亚网络招聘客服 编辑:程序博客网 时间:2024/04/29 19:05

C#写的dll为非标准的windows下dll,故一般其他语言不能直接调用,当然基于.net平台下的编程语言是可以调用,要让其他语言调用C#写的dll一般通过webservice服务或者是Com方式。经过在网上找资料以及自身的实践发现可以通过以下方式在Delphi和VB语言中调用。

1.编写C#写dll,用VS新建一个类库项目TestDll,源码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace TestDll
{
    /*
    1。所要导出的类必须为公有;
    2。所有属性、方法也必须为公有;
    3。要导出的属性、方法必须用接口方式;如果没有在接口中声明,即使该方法(属性)为公有,也不能正常导出到COM。但他们可以被别的.NET程序所使用;
    4。所有的事件也必须用接口方式;
    */

    public interface ITestClass
    {
        int Get(int a);
        string GetString();
    }
    [ClassInterface(ClassInterfaceType.None)]
    public class TestClass:ITestClass
    {
        public int Get(int a)
        {
            return ++a;
        }

        public string GetString()
        {
            return "test";
        }
    }
}
设置项目属性,选中项目-属性-应用程序-程序集信息,勾选"使程序集Com可见";属性-生成,勾选为com互操作注册。设置后重新生成项目,即会向系统注册此dll,Debug目录下会生成TestDll.dll和TestDll.tlb两个文件。

 

2.用Delphi新建一个应用程序,保存应用程序,然后选择"Project"-"Import type library",在弹出的对话框中选择上步生成的TestDll.tlb,并进行类名和输出目录等设置,点击“Create unit”,即会创建一个Delphi的tlb文件,在应用程序窗体界面放置2个按钮。一个按钮采用引入tlb文件方式调用,引入生成的tlb文件,一个按钮采用ole方式调用。

源码如下。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,ComObj;

type
  TForm1 = class(TForm)
    btn1: TButton;
    btn2: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses TestDll_TLB;

procedure TForm1.btn1Click(Sender: TObject);
var
  aClass:TTestClass;
begin
  aClass:=TTestClass.Create(nil);
  ShowMessage(IntToStr(aClass.Get(5)));
  ShowMessage(aClass.GetString);
end;

procedure TForm1.btn2Click(Sender: TObject);
var
  t:Variant;
begin
  t:=CreateOleObject('TestDll.TestClass');
  ShowMessage(IntToStr(t.Get(5)));
  ShowMessage(t.GetString);
end;

end.

编译运行,即可看到效果。采用tlb方式调用可以看到dll提供的方法,但操作步骤繁琐,而采用ole方式不能看到接口的定义但调用简单。

          

 

3.在VB中调用该dll,用VB新建一个Exe程序,然后点击“工具”-“引用”,定位到TestDll.tlb文件,在窗体上放置一按钮,按钮事件源码如下:

Private Sub CommandButton1_Click()
Dim o
Set o = CreateObject("TestDll.TestClass")
MsgBox o.Get(5)
MsgBox o.GetString
End Sub

编译运行即可看到效果。

   

 

 

 

原创粉丝点击