新文章 网摘 文章 随笔 日记

在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

 

posted @ 2021-03-12 14:54  岭南春  阅读(977)  评论(0)    收藏  举报