有人可以在这里发布示例如何在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;