请教delphi中怎样使用c#的类库,谢谢(50)

  • 主题发起人 主题发起人 sweidong
  • 开始时间 开始时间
S

sweidong

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个在c#中开发的类库dll,欲在delphi程序中调用,不知该如何操作,先谢谢了
 
不要试了,我这里试过好多次了,查了好多的资料,可就是不行呀。加载可以成功,调用就出地址错,我都郁闷了,只好给用别的办法了。给你些资料,我也是从网上搜的。你自己看看吧.Delphi调用C#类库 以前用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,生成do
tNet2Com_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);varFrm:TForm1;
begin
Frm:=TForm1.Create(self);
(Frm.DefaultInterface as SHFRM).ShchildFrm();//显示dll文件里窗体end;
delhi程序运行结果如下图: 注:在程序运行环境必须安装。net环境并注册dll文件 否则会报:无注册类别
 
Delphi调用C#类库来自:luyuan@ 绿源膳食 日期:2008-3-22 17:32:08 全文阅读:161 分类:IT 技术【摘要】 最近要做一个东西, 将几个程序的数据组合在一起进行输出, 以前的程序有用 Delphi 写的,有用.Net 写的, 都是没有存数据库的, 考虑再三, 决定做用C#做一个DLL, 专门用于操作数据库, 其它的程序调用这个DLL将数据存入数据库. 于是引出问题, Dephi 与 .Net 的互操作问题, 特写了下面的小程序测试Delphi 调用C#写的DLL. 【全文】最近要做一个东西, 将几个程序的数据组合在一起进行输出, 以前的程序有用 Delphi 写的,有用.Net 写的, 都是没有存数据库的, 考虑再三, 决定做用C#做一个DLL, 专门用于操作数据库, 其它的程序调用这个DLL将数据存入数据库. 于是引出问题, Dephi 与 .Net 的互操作问题, 特写了下面的小程序测试Delphi 调用C#写的DLL. 一.创建C#类库 public interface ICalc { int CalcSum(int a, int b);
}public class CCalc : ICalc { public int CalcSum(int a, int b) { return a + b;
}}编译成类库1. 用 VS.Net 开发工具;
注:用 VS.Net生成的类库在注册时,弹出”由于没有注册的类型,不能生成注册脚本”。不知什么原因, 有知道的朋友请告知。2. 用命令行Csc.exe /t:library /out:DotNet2Com.dll Icalc.cs Ccalc.cs二.DotNet 类库打包成COM类型库Tlbexp.exedo
tnet2com.dll /out:dotnet2com.tlb三.注册COM类型库Regasm.exedo
tNet2Com.dll注意:这里是注册DotNet 生成的类库,而不是tlb 文件。可以先注册成一个 reg 文件, 再导入到注册表.Regasm.exedo
tnet2com.dll /regfile:do
tnet2com.reg四.Delphi导入类型库Delpi 中, Project -> Import Type Library ,选中类型库:dotnet2com.tlb,生成do
tNet2Com_TLB 单元文件。单元文件中有接口 Icalc。 ICalc = interface(IDispatch) ['{2AE7BB2E-F24D-391F-BDD2-2C92C39629BF}'] function CalcSum(a: Integer;
b: Integer): Integer;
safecall;
end;
和代理类声明 TCCalc 及获得 Icalc 接口的属性: property DefaultInterface: _CCalc read GetDefaultInterface;
五.Delphi 中使用 usesdo
tNet2Com_TLB;
{$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);var result : integer;
c: TCCalc;
begin
c:= TCCalc.Create(self);
result:= (c.DefaultInterface as ICalc).CalcSum(1,2);
self.Edit3.Text := InttoStr(result);
end;
 
regasm注册.net下的dll2007-08-07 09:58程序集注册工具读取程序集中的元数据,并将所需的项添加到注册表中。注册表允许 COM 客户程序以透明方式创建 .NET Framework 类。类一经注册,任何 COM 客户程序都可以使用它,就好像该类是一个 COM 类。类仅在安装程序集时注册一次。程序集中的类实例直到被实际注册时,才能从 COM 中创建。regasm assemblyFile [options]参数参数 说明 assemblyFile要向 COM 注册的程序集。选项 说明 /codebase在注册表中创建一个 Codebase 项。Codebase 项指定未安装到全局程序集缓存中的程序集的文件路径。如果随后要安装正在注册到全局程序集缓存中的程序集,则不应指定此选项。用 /codebase 选项指定的 assemblyFile 参数必须是具有强名称的程序集。/registered指定此工具将仅引用已经注册的类型库。/asmpath:directory指定包含程序集引用的目录。必须和 /regfile 选项一起使用。/nologo取消显示 Microsoft 启动标题。/regfile [:regFile]为程序集生成指定的 .reg 文件,该文件包含所需的注册表项。指定此选项不更改注册表。此选项不能与 /u 选项或 /tlb 选项一起使用。/silent 或 /s取消显示成功消息。/tlb [:typeLibFile]从指定的程序集生成类型库,该类型库包含在程序集中定义的可访问类型的定义。/unregister 或 /u注销在 assemblyFile 中找到的可创建类。省略此选项将导致 Regasm.exe 注册程序集中的可创建类。/verbose指定详细模式;当用 /tlb 选项指定时,显示所有需要为其生成类型库的引用程序集的列表。/? 或 /help显示该工具的命令语法和选项。注意Regasm.exe 命令行选项不区分大小写。只需提供足够的选项来唯一标识它。例如,/n 等效于 /nologo,而 /t:outfile.tlb 等效于 /tlb:outfile.tlb。可以使用 /regfile 选项生成包含注册表项的 .reg 文件,而不是直接对注册表进行更改。通过注册表编辑器工具 (Regedit.exe) 导入 .reg 文件,可以在计算机上更新注册表。请注意,.reg 文件不包含任何可由用户定义的注册函数完成的注册表更新。注意,/regfile 选项只为托管类发出注册表项。此选项不为 TypeLibID 或 InterfaceID 发出注册表项。指定 /tlb 选项时,Regasm.exe 生成并注册一个类型库,对在程序集中找到类型进行描述。Regasm.exe 将生成的类型库放到当前的工作目录中或为输出文件指定的目录中。为引用其他程序集的程序集生成类型库可能导致同时生成几个类型库。可使用类型库向开发工具(如 Visual Studio 2005)提供类型信息。如果正在注册的程序集是由类型库导入程序 (Tlbimp.exe) 产生的,则不应使用 /tlb 选项。如果程序集是从类型库导入的,则不能从它导出类型库。除了类型库导出程序 (Tlbexp.exe) 不能注册它产生的类型库外,使用 /tlb 选项同使用 Tlbexp.exe 和 Regasm.exe 的效果相同。如果使用 /tlb 选项注册某个类型库,则可将 /tlb 选项和 /unregister 选项一起使用,以注销该类型库。将两个选项一起使用将注销类型库和接口项,这样可较大程度地清理注册表。当您注册一个程序集供 COM 使用时,Regasm.exe 会在本地计算机的注册表中添加一些项。更具体地说就是,它创建与版本相关的注册表项,这些项允许在一台计算机上并行运行同一程序集的多个版本。第一次注册程序集时,会为该程序集创建一个顶级项并为这个程序集版本创建一个唯一的子项。每次注册该程序集的新版本时,Regasm.exe 都为新版本创建一个子项。例如,假设您要注册一个版本为 1.0.0.0 的托管组件 myComp.dll 供 COM 使用。后来,您又注册版本为 2.0.0.0 的 myComp.dll。您确定计算机上的所有 COM 客户端应用程序都要使用 2.0.0.0 版本的 myComp.dll,并且决定注销 myComponent.dll 版本 1.0.0.0。此注册表方案允许您注销 myComp.dll 版本 1.0.0.0,这是因为注销操作只移除 1.0.0.0 版本子项。使用 Regasm.exe 注册程序集之后,可以将该程序集安装在全局程序集缓存中,以便可以从任何 COM 客户端激活它。如果程序集仅准备由单个应用程序激活,则可以将它放到该应用程序的目录中。下面的命令注册 myTest.dll 中包含的所有公共类。regasm myTest.dll下面的命令生成文件 myTest.reg,该文件包含所有必要的注册表项。此命令不更新注册表。regasm myTest.dll /regfile:myTest.reg下面的命令注册 myTest.dll 中包含的所有公共类,并生成和注册类型库 myTest.tlb,该类型库包含 myTest.dll 中定义的所有公共类型的定义。regasm myTest.dll /tlb:myTest.tlb好了,接下来我们就可以在自己的基于目前COM技术的代码中方便的使用上面我们使用C#编写的.NET组件了。在这里,我们使用VB6.0编写一个小小的测试代码,在开始之前我们需要在VB的集成环境中使用菜单中的“引用”选项,选择我们刚才产生的类型库文件ClassLibrary1.tlb。 VB测试的代码如下: Private Sub Form_Load() Dim test As New ClassLibrary1.hello Dim str As String str = test.say("dddd") MsgBox str End Sub
 
这是个很有用的目录,很多工具都在这个下面的:在C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322目录下
 
实现在Delphi中调用 C# 封装的DLL中的方法(Function)和过程(Procedure)现把实施步骤写下 1、建立:DotNetFunc.cs 封装要使用的Function、Procedure。  2、生成密钥文件,用于给程序集强名称签名  sn -k key.snk   3、使用强名称签名,编译成类库  csc /t:librarydo
tNetFunc.cs  4、生成类型库  tlbexpdo
tNetFunc.dll /out:DotNetFunc.tlb   5、注册dll  regasmdo
tNetFunc.dll   6、移入gac全局程序集缓存  gacutil -ido
tNetFunc.dll  7、Delphi中的调用测试uses Variants, COMOBJ, OleCtnrs, Activex;procedure TForm1.Button1Click(Sender: TObject);var SharpObject: Variant; TestValue: string;
begin
 try  try   SharpObject := CreateOleObject('CSharpServer.SharpObject');   TestValue := SharpObject.DecryptTripleDES(Edit1.Text);   Edit2.Text :=TestValue;  except   on e: exceptiondo
   begin
    ShowMessage(e.Message);   end;
  end;
 finally  SharpObject := Unassigned; end;
end;
procedure TForm1.Button2Click(Sender: TObject);var SharpObject: Variant; TestValue: string;
begin
 try  try   SharpObject := CreateOleObject('CSharpServer.SharpObject');   TestValue := SharpObject.EncryptTripleDES(Edit2.Text);   Edit1.Text :=TestValue;  except   on e: exceptiondo
   begin
    ShowMessage(e.Message);   end;
  end;
 finally  SharpObject := Unassigned; end;
end;
initialization CoInitialize(nil);finalization CoUninitialize;
end.
 
在网上搜到一个例子,是在delphi8中实现的,我也试过了可以,但在delphi7或delphi2007,2009中这样调用就不行,请教该如何操作,谢谢C#构建类库,代码: using System;
namespace CSharpDLL { public class Hello { public void SayHello() { Console.WriteLine("Hello, World!");
Console.WriteLine("Press any key to continue...");
Console.Read();
} } } Delphi 8构建控制台程序(不要用VCL程序,有可能不兼容)。代码如下: program DelphiClient;
{$APPTYPE CONSOLE} {%DelphiDotNetAssemblyCompiler 'CSharpDLL.dll'} uses SysUtils, CSharpDLL;
var h : Hello;
begin
h := Hello.Create();
h.SayHello();
end.
 
to 草原骏马:在第一个例子中,究竟类型库是SFrm.tlb还是dotnet2com.tlb,按你的方法试了,但就是在Delpi 中, Project -> Import Type Library ,找不到类型库:dotnet2com.tlb,也没有SFrm.tlb,如果Add的话,加载类型库/dll时出错
 
后退
顶部