有人可以在这里发布示例如何在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。
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不喜欢他们。当我启用它们时,我的程序奇怪地冻结了。
Set8087CW($133F);
Application.Initialize;
该类必须是可见的。如果整个程序集都具有ComVisible(false),则情况可能并非如此。
.Net类默认情况下将与IDispatch兼容,因此,如果该类确实是可看见的,则您的示例应该可以正常工作。
但首先将其降至最低限度。将您的exe文件与.Net程序集放在同一文件夹中,然后跳过配置文件和应用程序库。
在某种东西混在一起之前,异常就在这里,对吗?
ov := obj.Unwrap;