在Delphi中打开Winform窗体(干货)
在Delphi中打开Winform窗体(不须要注册COM,C#输出目标为x86)
1、下载https://github.com/project-jedi/jcl
2、如果您从GitHub以ZIP文件的形式下载JCL,则还必须从https://github.com/project-jedi/jedi项目下载jedi.inc和kylix.inc文件,并将它们复制到jcl \ jcl \ source \ include \ jedi目录。
3、把下载的文件夹复制到Delphi安装目录Borland\Delphi7\下面,执行jcl\install.bat就会自动安装。
4、使用vs创建一个包含Winform窗体的类库,并且在窗体类上添加[ComVisible(true)]属性
[ComVisible(true)] public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("您好,攻城獅"); } }
5、生成Winform的类库,并将其复制到delphi项目的输出目录下
6、在Delphi代码中:
uses //…… JclDotNet; private { Private declarations } FClrHost: TJclClrHost; //调用 C# Winform procedure CallWinform; procedure TForm1.FormCreate(Sender: TObject); begin FClrHost := TJclClrHost.Create('v4.0.30319'); FClrHost.Start; end; procedure TForm1.FormDestroy(Sender: TObject); begin FClrHost.Stop(); FClrHost.Free; end; procedure TForm1.CallWinform; var Fads: TJclClrAppDomainSetup; Fad: TJclClrAppDomain; obj: OleVariant; Result:Integer; begin try //第一个参数为dll名称,注意不要加.dll扩展名,第二个参数是Form窗体的类型,带命名空间 obj := FClrHost.DefaultAppDomain.CreateInstance('不带扩展名的dll文件名', '带命名空间的类名(在这里是Form1的类名)').Unwrap(); obj.Show; except on E: Exception do begin ShowMessage('Exception class name = ' + E.ClassName + ' ' + 'Exception message = ' + E.Message); end; end; end; //调用 C# Winform procedure TForm1.BtnCallWinformClick(Sender: TObject); begin CallWinform; end;
案例:
https://github.com/acj1971/DelphiDotNETInteropJVCLExamples
jcl项目:
https://github.com/project-jedi/jcl
浙公网安备 33010602011771号