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

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

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

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

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

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

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

.net,delphi,winapi,com,interop,

13

Ответов: 7


7 принят

В 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;

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

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


6

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

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


4

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


3

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

.net, Дельфы, WinAPI, COM, Interop,
Похожие вопросы