分享

delphi如何调用C#的dll

 quasiceo 2012-12-14

delphi如何调用C#的dll

delphi如何调用C#的dll?

在你的环境变量Path中加入
C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin;
C:\WINNT\Microsoft.NET\Framework\v1.1.4322

随便建立一个ClassLibrary编译成DLL文件
切换到MS-DOS命令行下面,运行:
C:\>regasm out ClassLibrary1.DLL /regfile:ClassLibrary1.reg

上面的命令行是注册我们的.NET组件,并且产生了一个备用的注册表文件。对应Windows的注册COM文件命令:regsvr32 c:\test.dll .
在.NET下面,注册.NET组件就需要上面的regasm命令了

然后在MS-DOS命令行下面,运行:
C:\>tlbExp ClassLibrary1.dll /out:ClassLibrary1.tlb

上面的命令行表示将会产生一个.NET组件的类型库
有了TLB文件也就和正常的COM组件一样了,运行Delphi导入类型库文件TLB......
和正常的COM调用一样



  • 以前用delphi写的CS程序 今天客户要加几个模块上去 ,刚好会点C# ,这后面模块就用C#写的编译成dll文件, 在用delphi调用C#写的dll文件时折腾好阵子 就有了这些经历写下来。

    一、打开vs2005

    新建windows应用程序项目命名为SFrm,删除应用程序自动生成的Program.cs

    (因为我们是要生成dll文件)

    在窗体类新建一接口(interface SHFRM) 让窗体类实现接口 代码如下:

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Data.SqlClient;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;



    namespace SFrm

    {

    public interface SHFRM //此接口用在delphi下调用必须用到

    {

    void ShchildFrm();

    }



    public partial class Form1 : Form,SHFRM

    {

    private BindingSource bindingSource1 = new BindingSource();

    private SqlDataAdapter dataAdapter = new SqlDataAdapter();



    public Form1()

    {

    InitializeComponent();

    }

    /// <summary>

    /// 显示窗口

    /// </summary>

    public void ShchildFrm()

    {

    Form1 frm = new Form1();

    frm.Show();

    }

    /// <summary>

    /// 按钮事件

    /// </summary>

    /// <param name="sender"></param>

    /// <param name="e"></param>

    private void button1_Click(object sender, EventArgs e)

    {

    dataGridView1.DataSource = bindingSource1;

    GetData("select * from Customers");



    }

    private void GetData(string selectCommand)

    {

    try

    {



    String connectionString = "Data Source=.;initial catalog=Northwind;user id =sa;pwd=";

    dataAdapter = new SqlDataAdapter(selectCommand, connectionString);



    SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);



    DataTable table = new DataTable();

    table.Locale = System.Globalization.CultureInfo.InvariantCulture;

    dataAdapter.Fill(table);

    bindingSource1.DataSource = table;

    dataGridView1.AutoResizeColumns(

    DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);



    }

    catch (SqlException)

    {

    MessageBox.Show("To run this example, replace the value of the " +

    "connectionString variable with a connection string that is " +

    "valid for your system.");

    }

    }

    }

    }

    右击项目名在属性对话框中更改输出类型为”类库” 在界面点击程序集信息 按钮 如下图:



    使程序集com可见必须选中

    完成dll文件生成





    二.DotNet 类库打包成COM类型库(在vs命令行执行如下操作)

    Tlbexp.exe SFrm.dll /out: SFrm.tlb

    三.注册COM类型库

    Regasm.exe SFrm.dll

    四.Delphi导入类型库

    Delpi 中, Project -> Import Type Library ,选中类型库:dotnet2com.tlb,

    生成 DotNet2Com_TLB 单元文件。单元文件中有接口 SHFRM。

    SHFRM = interface(IDispatch)

    ['{D8400C54-E4B2-36BD-B970-45CD204F319A}']

    procedure ShchildFrm; safecall;

    end;和代理类声明 TForm1及获得 SHFRM 接口的属性:

    property DefaultInterface: _Form1 read GetDefaultInterface;



    五.Delphi 中使用



    uses

    SFrm_TLB;



    {$R *.dfm}



    procedure TForm1.Button1Click(Sender: TObject);

    var

    Frm:TForm1;

    begin

    Frm:=TForm1.Create(self);

    (Frm.DefaultInterface as SHFRM).ShchildFrm();//显示dll文件里窗体

    end;



    delhi程序运行结果如下图:



    注:在程序运行环境必须安装。net环境并注册dll文件 否则会报:无注册类别

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多