Размещение среды выполнения.NET в программе Delphi
Я пытался использовать некоторый код.NET из Delphi-программы, мне нужно сделать свою программу расширяемой с помощью сборок.net и предопределенных функций (я уже поддерживаю обычные библиотеки DLL).
После долгих поисков в Интернете я нашел Managed-VCL, но я не готов платить 250 долларов за то, что мне нужно, я также нашел несколько групп новостей с неполным кодом, который не работает.
Я использую Delphi 2007 для win32. Что я могу использовать для динамического выполнения функции из сборки с предопределенными параметрами?
Что-то вроде:
procedure ExecAssembly(AssemblyFileName:String; Parameters: Variant);
Я просто хочу добавить, что мне нужно иметь возможность загружать произвольные сборки (может быть, все сборки в определенной папке), поэтому создание оболочки C# может не работать.
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 не так уж и сложно (особенно если вы используете только один домен приложений). Вы можете использовать API хостинга на основе COM для запуска среды выполнения, загрузки сборок, создания объектов и вызова для них методов.
В Интернете много информации, например, документация MSDN " Хостинг общеязыковой среды выполнения". ( новый дом)
Я могу сказать вам из первых рук, что взаимодействие с.Net из Delphi - это не пикник. Я парень.Net, но некоторое время работал в магазине.Net и Delphi. Я управлял несколькими проектами, которые были написаны на.Net (WinForms и WPF), но были вызваны Delphi. Наши ребята из Delphi написали слой взаимодействия для Delphi, чтобы обращаться к библиотекам.Net, так как все наши новые продукты были написаны в.Net. Это было проблемой для нас (и это были хорошие разработчики Delphi). Если бы мы могли купить хорошую стороннюю библиотеку, чтобы сделать взаимодействие для нас, это стоило бы того. Могу поспорить, что мы потратили тысячи долларов на трудозатраты на написание и отладку взаимодействия с Delphi в.Net.
Я бы взял эту библиотеку Managed-VLC для тест-драйва, чтобы посмотреть, насколько хорошо она работает. Если он оправдывает свою рекламу, то он легко стоит 250 долларов.
Смотрите мой вопрос для сквозного примера размещения CLR в Delphi с JCL.
У меня была точно такая же проблема. Я работал в магазине Delphi, и они хотели начать добавлять функциональность в устаревшее приложение Delphi с.NET и C#. Я посмотрел на Managed-VLC и решил пропустить его, так как чувствовал, что у него есть серьезные проблемы. Я нашел кое-что гораздо более простое: Delphi.NET. Примечание: это не та версия Delphi, которая изначально работает в.NET. Это проект с открытым исходным кодом, позволяющий устаревшим приложениям Delphi получать доступ к функциональным возможностям.NET через COM и рефлексию. Несмотря на то, что он старый, он работает как шарм, так как использует COM. Я проверю, что это работает с.NET 2.0 и 3.5. Я получил.NET DLL полностью интегрированную в наше устаревшее приложение Delphi 5 за несколько дней. Мой босс думал, что я супергерой. Удачи!
Вы можете использовать Delphi для.Net и неуправляемого экспорта, также называемого обратным P/Invoke.
По сути, это позволяет вам создать.Net .dll, которая имеет полный доступ к.Net framework, но может быть загружена любым родным языком, так же, как вы это делаете с любым.dll, и без накладных расходов на совместное взаимодействие.
Вот простой пример: http://cc.codegear.com/Item/22688
Вы можете использовать классы.Net в качестве COM-объектов в Delphi:
- создать сборку в C#
- создать библиотеку типов для сборки
- импортировать библиотеку типов в Delphi
Теперь вы можете получить доступ к классам из.Net сборки, которые экспортируются в библиотеку типов.