有人可以在这里发布示例如何在Delphi中托管CLR吗?我在这里已经阅读了类似的question,但是由于要在Delphi 5中托管它,因此无法使用JCL。谢谢。

编辑:关于在Fox Pro中托管CLR的article看起来很有希望,但我不知道如何从Delphi访问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;很重要。默认情况下,Delphi启用了浮点异常(请参阅this),而CLR不喜欢它们。当我启用它们时,我的程序奇怪地冻结了。

最佳答案

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

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

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

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

 ov := obj.Unwrap;

10-06 05:08
查看更多