2008-11-03 2 views
12

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

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

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

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

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

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

ответ

7

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

Я слепой или нет примера, как его использовать? – 2010-01-12 17:31:15

2

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

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

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

6

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

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

7

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

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

+0

Я получаю «Не могу загрузить файл или сборку» RGiesecke.DllExport.Metadata, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = ad5f9f4a55b5020b или одну из его зависимостей. Система не может найти указанный файл. «Я использую этот пакет из-за` [DllExport] `аннотации. Вопрос [здесь] (http://stackoverflow.com/q/23383839/675577) – dialex 2014-04-30 09:10:44

3

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

2

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

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

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

4

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

Смежные вопросы