Подтвердить что ты не робот

Хостинг среды выполнения .NET в программе Delphi

Я искал использование некоторого .NET-кода из программы Delphi, мне нужно будет сделать мою программу расширяемой, используя сборки .net и предопределенные функции (я уже поддерживаю обычные библиотеки DLL).

После многого поиска в Интернете я нашел Managed-VCL, но я не готов заплатить 250 долларов за то, что мне нужно, я также нашли некоторые группы новостей с неполным кодом и не работают.

Я использую Delphi 2007 для win32. Что я могу использовать для динамического выполнения функции из сборки с предопределенными параметрами?

Что-то вроде:

procedure ExecAssembly(AssemblyFileName:String; Parameters: Variant);

Я просто хочу добавить, что мне нужно иметь возможность загружать произвольные сборки (возможно, все сборки в определенной папке), поэтому создание оболочки С# может не работать.

4b9b3361

Ответ 1

В JEDI Code Library (JCL) - бесплатно - есть JclDotNet.pas, содержащий класс TJclClrHost, возможно, делая то, что вы хотите:

  TJclClrHost = class(TJclClrBase, ICorRuntimeHost)
  private
    FDefaultInterface: ICorRuntimeHost;
    FAppDomains: TObjectList;
    procedure EnumAppDomains;
    function GetAppDomain(const Idx: Integer): TJclClrAppDomain;
    function GetAppDomainCount: Integer;
    function GetDefaultAppDomain: IJclClrAppDomain;
    function GetCurrentAppDomain: IJclClrAppDomain;
  protected
    function AddAppDomain(const AppDomain: TJclClrAppDomain): Integer;
    function RemoveAppDomain(const AppDomain: TJclClrAppDomain): Integer; 
  public
    constructor Create(const ClrVer: WideString = '';
      const Flavor: TJclClrHostFlavor = hfWorkStation;
      const ConcurrentGC: Boolean = True;
      const LoaderFlags: TJclClrHostLoaderFlags = [hlOptSingleDomain]);
    destructor Destroy; override;
    procedure Start;
    procedure Stop;
    procedure Refresh;
    function CreateDomainSetup: TJclClrAppDomainSetup;
    function CreateAppDomain(const Name: WideString;
      const Setup: TJclClrAppDomainSetup = nil;
      const Evidence: IJclClrEvidence = nil): TJclClrAppDomain;
    function FindAppDomain(const Intf: IJclClrAppDomain; var Ret: TJclClrAppDomain): Boolean; overload;
    function FindAppDomain(const Name: WideString; var Ret: TJclClrAppDomain): Boolean; overload;
    class function CorSystemDirectory: WideString;
    class function CorVersion: WideString;
    class function CorRequiredVersion: WideString;
    class procedure GetClrVersions(VersionNames: TWideStrings); overload;
    class procedure GetClrVersions(VersionNames: TStrings); overload;
    property DefaultInterface: ICorRuntimeHost read FDefaultInterface implements ICorRuntimeHost;
    property AppDomains[const Idx: Integer]: TJclClrAppDomain read GetAppDomain; default;
    property AppDomainCount: Integer read GetAppDomainCount;
    property DefaultAppDomain: IJclClrAppDomain read GetDefaultAppDomain;
    property CurrentAppDomain: IJclClrAppDomain read GetCurrentAppDomain;
  end;

Ответ 2

Хостинг CLR сам по себе не так уж и сложный (особенно если вы используете только один AppDomain). Вы можете использовать API-интерфейсы хостинга на основе COM, чтобы запускать среду выполнения, загружать сборки, создавать объекты и вызывать методы на них.

Существует много информации в Интернете, например, документация MSDN на тему "" Хостинг для Common Language Runtime".

Ответ 3

Я могу сказать вам из первых рук, что взаимодействие с .Net от Delphi не является пикником. Я парень .Net, но некоторое время работал в магазине .Net и Delphi. Мне удалось выполнить несколько проектов, написанных в .Net(WinForms и WPF), но были вызваны Delphi. Наши ребята из Delphi написали слой взаимодействия для Delphi, чтобы обратиться к библиотекам .Net, так как все наши новые продукты писали в .Net. Это была проблема для нас (и это были хорошие разработчики Delphi). Если бы мы могли купить хорошую стороннюю библиотеку для взаимодействия для нас, это было бы более чем того стоит. Бьюсь об заклад, мы потратили тысячи долларов на человеко-часовые проблемы с записью и отладкой с помощью взаимодействия с Delphi на .Net.

Я бы взял эту библиотеку Managed-VLC для тестового диска, чтобы увидеть, насколько хорошо он работает. Если он оправдывает свою рекламу, то он легко стоит 250 долларов.

Ответ 4

См. мой вопрос для конечного примера размещения CLR в Delphi с JCL.

Ответ 5

У меня была такая же проблема. Я работал в магазине Delphi, и они хотели начать добавлять функциональность к устаревшему Delphi-приложению с .NET и С#. Я посмотрел на Managed-VLC, и я решил пропустить его, поскольку у меня были серьезные проблемы. Я нашел здесь нечто гораздо более простое: Delphi.NET. Примечание. Это не версия Delphi, которая выполняется на .NET. Это проект с открытым исходным кодом, позволяющий устаревшим приложениям Delphi получать доступ к функциям .NET через COM и их отражение. Несмотря на то, что он старый, он работает как шарм, поскольку он использует COM. Я проверю, что он работает с .NET 2.0 и 3.5. Я получил .NET DLL, полностью интегрированный в наше устаревшее приложение Delphi 5 за несколько дней. Мой босс думал, что я супергерой. Удачи!

Ответ 6

Вы можете использовать классы .Net как COM-объекты в Delphi:

  • создать сборку в С#
  • создать библиотеку типов для сборки
  • библиотека типов импорта в Delphi

Теперь вы можете получить доступ к классам из сборки .Net, которые экспортируются в библиотеке типов.

Ответ 7

Вы можете использовать Delphi для .Net и неуправляемого экспорта, также называемого обратным P/Invoke.

Это, по сути, позволяет вам создать .Net.dll, который имеет полный доступ к инфраструктуре .Net, но может быть загружен любым родным языком, как и с любым .dll, и без накладных расходов. /p >

Вот простой пример: http://cc.codegear.com/Item/22688