首页 > 代码库 > C#写的dll跨语言调用
C#写的dll跨语言调用
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
编译运行即可看到效果。
转自:http://blog.csdn.net/zhenghui1/article/details/8070152