Размещение среды выполнения .NET в программе Delphi - PullRequest
13 голосов
/ 03 ноября 2008

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

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

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

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

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

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

Ответы [ 7 ]

7 голосов
/ 19 ноября 2008

В 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;
7 голосов
/ 03 ноября 2008

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

В Интернете много информации, например, документация MSDN " Hosting Common Language Runtime ". ( новый дом )

6 голосов
/ 03 ноября 2008

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

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

4 голосов
/ 13 января 2010

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

3 голосов
/ 03 ноября 2008

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

2 голосов
/ 03 ноября 2008

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

По сути, это позволяет вам создать .Net .dll, которая имеет полный доступ к .Net framework, но может быть загружена любым родным языком, так же, как вы это делаете с любым .dll, и без накладных расходов на взаимодействие.

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

2 голосов
/ 03 ноября 2008

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

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

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

...