C# 调用Delphi 动态链接库通过回调实现发布订阅
在C#中是通过 委托来实现发布订阅机制,其实这和Delphi 中的方法指针类型如出一辙,这里通过一个小Deamo 来说明一下
- Delphi 实现动态库
library mydll;
uses
SysUtils,
Dialogs,
Classes,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
function showInfo(const s:PAnsiChar):Integer;stdcall;
begin
showMessage('这是Delphi 方法,收到的参数是:'+s);
result:=1;
end;
exports
showInfo,showfrm;
begin
end.
Form1 窗体部分代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TMyMethod=procedure(const s:PAnsiChar);stdcall; //这里其实和C#中的委托是一致的
TForm1 = class(TForm)
tmr1: TTimer;
mmo1: TMemo;
btn1: TButton;
procedure tmr1Timer(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
FMyMethod:TMyMethod;
public
{ Public declarations }
property OnMyMethod:TMyMethod read FMyMethod write FMyMethod;
end;
var
Form1: TForm1;
procedure showfrm(const handle:Cardinal;method1:TMyMethod);stdcall;
implementation
{$R *.dfm}
procedure showfrm(const handle:Cardinal;method1:TMyMethod);stdcall;
begin
Application.Handle:=handle;
if not Assigned(Form1) then
begin
form1:=TForm1.Create(Application);
Form1.OnMyMethod:=method1;
Form1.tmr1.Enabled:=True;
end;
Form1.OnMyMethod:=method1;
Form1.Show;
end;
procedure TForm1.tmr1Timer(Sender: TObject);
begin
if Assigned(OnMyMethod) then
begin
OnMyMethod(PAnsiChar('这是Delphi 的回调,时间:'+datetimetostr(now)));
end;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
tmr1.Enabled:=True;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.Free;
Form1:=nil;
end;
end.
- C# 部分代码
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WinOtherDll
{
public delegate void MyMehtod(string s);
public partial class Form1 : Form
{
[DllImport("mydll.dll",CharSet =CharSet.Ansi)]
public static extern Int32 showInfo(string s);
[DllImport("mydll.dll", CharSet = CharSet.Ansi)]
public static extern void showfrm(IntPtr h,MyMehtod myMehtod);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int a=showInfo("我是C#");
MessageBox.Show($"返回结果是:{a}");
}
private void button2_Click(object sender, EventArgs e)
{
showfrm(this.Handle,(s)=> {
listBox1.Items.Add(s);
});
}
private void button3_Click(object sender, EventArgs e)
{
showfrm(Handle, null);
}
}
}
- 效果:
分类:
C# .net开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!