Хостинг CLR в Delphi с / без JCL - пример
Может кто-нибудь опубликовать здесь пример, как разместить CLR в Delphi? Я читал подобноевопрос здесь, но я не могу использовать JCL, так как хочу разместить его в Delphi 5. Спасибо.
РЕДАКТИРОВАТЬ: этостатья о размещении CLR в Fox Pro выглядит многообещающе, но я нене знаю, как получить доступ к clrhost.dll из Delphi.
Изменить 2: Я отказываюсь от требования Delphi 5. Сейчас я'Я пытаюсь JCL с Delphi 7. Но я опять не могу найти ни одного примера. Вот что я имею до сих пор:
Моя сборка 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;
}
}
}
Важная заметка:При работе с .NET из Delphi важно вызыватьSet8087CW($133F);
в начале вашей программы (т.е. доApplication.Initialize;
). В Delphi по умолчанию включены исключения с плавающей запятой (см.этот) и CLR неони мне не нравятся. Когда я их включил, моя программа странно зависла.