Может кто-нибудь, пожалуйста, напишите здесь пример того, как размещать CLR в Delphi? Я прочитал аналогичный question здесь, но я не могу использовать JCL, поскольку хочу разместить его в Delphi 5. Спасибо.
EDIT: Эта статья о размещении CLR в Fox Pro выглядит многообещающе, но я не знаю, как Доступ к clrhost.dll из Delphi.
Изменить 2: Я отказываюсь от требования Delphi 5. Теперь я пытаюсь использовать JCL с Delphi 7. Но опять же я не могу найти ни одного примера. Вот что я имею до сих пор:
Моя сборка С#:
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 разрешает исключения с плавающей запятой (см. this), и CLR им не нравится. Когда я включил их, моя программа была заморожена.