有人可以在這裏發佈一個例子如何在Delphi中託管CLR?我在這裏看過類似的question,但是我不能使用JCL,因爲我想用Delphi 5託管它。謝謝。在Delphi中使用/不使用JCL託管CLR - 示例
編輯:這article關於福克斯臨託管CLR看起來很有希望,但我不知道如何從德爾福訪問clrhost.dll。
編輯2:我放棄對德爾福5的要求。現在我正在用Delphi 7試用JCL。但是我再次找不到任何示例。下面是我至今:
我的C#程序集:
namespace DelphiNET
{
public class NETAdder
{
public int Add3(int left)
{
return left + 3;
}
}
}
我把它編譯成DelphiNET.dll
。
現在我想利用這個組件與德爾福:
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:變種沒有引用一個自動化對象
我還沒有與德爾福工作了很時間,所以我在這裏停留...
解決方案:ŧ這是COM默認情況下的問題。這是正確的.NET程序集:
namespace DelphiNET
{
[ComVisible(true)]
public class NETAdder
{
public int Add3(int left)
{
return left + 3;
}
}
}
重要提示:
當德爾福.NET的工作,重要的是在你的程序的開始調用Set8087CW($133F);
(Application.Initialize;
前即)。 Delphi默認啓用了浮點異常(請參見this),CLR不喜歡它們。當我啓用它們時,我的程序奇怪地凍結了。
爲什麼不能在Delphi 5中使用JCL?也可能在一些小的變化之後呢? – 2010-01-12 11:52:52
JclDotNet.pas是用Delphi 6開發的,在Delphi 5中使用它看起來不會有細微的變化。 – 2010-01-12 12:36:22
您是否考慮過Managed VCL? – 2010-01-12 12:58:33