Dot-Net

在 Delphi 程序中託管 .NET 執行時

  • October 5, 2018

我正在考慮在 Delphi 程序中使用一些 .NET 程式碼,我需要使用 .net 程序集和預定義函式(我已經支持正常 DLL)使我的程序可擴展。

經過大量的線上搜尋,我找到了 Managed-VCL,但我還沒有準備好為我需要的東西支付 250 美元,我還發現一些新聞組的程式碼不完整且無法正常工作。

我正在將 Delphi 2007 用於 win32。我可以使用什麼來從具有預定義參數的程序集中動態執行函式?

就像是:

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

我只想補充一點,我需要能夠載入任意程序集(可能是特定文件夾中的所有程序集),因此創建 C# 包裝器可能不起作用。

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

引用自:https://stackoverflow.com/questions/258875