您的位置:首页 > 编程语言 > C#

C#写的dll跨语言调用

2012-10-14 18:03 330 查看
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

编译运行即可看到效果。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: