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
编译运行即可看到效果。
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
编译运行即可看到效果。
相关文章推荐
- 巧用C#做中间语言 实现Java调用.net DLL(转)
- c#编写dll 供其他语言调用问题
- C#编写dll库文件并注册为COM组件供其他语言(如PHP等)调用
- c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL
- C#中调用其他语言写的DLL
- 巧用C#做中间语言 实现Java调用.net DLL的方法
- VS环境C#语言中如何生成和调用DLL
- 易语言写DLL给C#调用读写注册表
- VS环境C#语言中如何生成和调用DLL
- C#中调用其他语言写的DLL
- 将C语言编译成DLL并用C#进行调用以及关于从C#传输中文路径到C的DLL中打开文件的问题
- 巧用C#做中间语言 实现Java调用.net DLL
- 巧用C#做中间语言 实现Java调用.net DLL的方法
- 关于C++调用C#语言DLL(类库)
- 巧用C#做中间语言 实现Java调用.net DLL的方法
- 巧用C#做中间语言 实现Java调用.net DLL
- C#调用C++的DLL搜集整理的所有数据类型转换方式
- C# 调用 C++ dll 函数 时传递字符串 需要注意的问题