一尘不染

在带有/不带有JCL的Delphi中托管CLR-示例

c#

有人可以在这里发布示例如何在Delphi中托管CLR吗?我在这里读过类似的问题,但是由于要在Delphi 5中托管它,所以无法使用JCL。谢谢。


编辑:文章关于福克斯临外观托管CLR很有前途,但我不知道如何从德尔福访问clrhost.dll。


编辑2: 我放弃了Delphi 5要求。现在,我正在尝试使用Delphi 7进行JCL。但是,再次找不到任何示例。这是我到目前为止所拥有的:

我的C#程序集:

namespace DelphiNET
{
    public class NETAdder
    {
        public int Add3(int left)
        {
            return left + 3;
        }
    }
}

我已将其编译为DelphiNET.dll

现在,我想使用来自Delphi的该程序集:

uses JclDotNet, mscorlib_TLB;

procedure TForm1.Button1Click(Sender: TObject);
var
  clr: TJclClrHost;
  ads: TJclClrAppDomainSetup;
  ad: TJclClrAppDomain;
  ass: TJclClrAssembly;
  obj: _ObjectHandle;
  ov: OleVariant;
begin
  clr := TJclClrHost.Create();
  clr.Start;
  ads := clr.CreateDomainSetup;
  ads.ApplicationBase := 'C:\Delhi.NET';
  ads.ConfigurationFile := 'C:\Delhi.NET\my.config';
  ad := clr.CreateAppDomain('myNET', ads);
  obj := (ad as _AppDomain).CreateInstanceFrom('DelphiNET.dll', 'DelphiNET.NETAdder');
  ov := obj.Unwrap;
  Button1.Caption := 'done ' + string(ov.Add3(5));
end;

结束于错误: EOleError:Variant不引用自动化对象

我已经很长时间没有与Delphi合作了,所以我被困在这里…


解决方案: COM可见性存在问题,默认情况下不是这样。这是正确的.NET程序集:

namespace DelphiNET
{
    [ComVisible(true)]
    public class NETAdder
    {
        public int Add3(int left)
        {
            return left + 3;
        }
    }
}

重要的提示:

从Delphi使用.NET时,Set8087CW($133F);在程序的开头(即之前Application.Initialize;)进行调用很重要。德尔福已启用默认浮点异常(见)和CLR不喜欢他们。当我启用它们时,我的程序奇怪地冻结了。


阅读 336

收藏
2020-05-19

共1个答案

一尘不染

该类必须是可见的。如果整个程序集都具有ComVisible(false),则情况可能并非如此。

.Net类默认情况下将与IDispatch兼容,因此,如果该类确实是可看见的,则您的示例应该可以正常工作。

但首先将其降至最低限度。将您的exe文件与.Net程序集放在同一文件夹中,然后跳过配置文件和应用程序库。

在某种东西混在一起之前,异常就在这里,对吗?

 ov := obj.Unwrap;
2020-05-19