誰かが Delphi で CLR をホストする方法の例をここに投稿できますか? ここで同様の質問を読みましたが、Delphi 5 でホストしたいので JCL を使用できません。ありがとうございます。
編集: Fox Pro での CLR のホスティングに関するこの記事は有望に見えますが、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: バリアントはオートメーション オブジェクトを参照していません
私は長い間 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 はデフォルトで浮動小数点例外を有効にしており(これを参照)、CLR はそれらを好まない。それらを有効にすると、プログラムが奇妙にフリーズしました。