代码之家  ›  专栏  ›  技术社区  ›  Osama Al-Maadeed

在Delphi程序中托管.NET运行时

  •  13
  • Osama Al-Maadeed  · 技术社区  · 16 年前

    我想在Delphi程序中使用一些.NET代码,我需要使用.NET程序集和预定义函数使我的程序可扩展(我已经支持常规DLL)。

    在网上搜索了很多次之后,我发现 Managed-VCL ,但我还没准备好支付250美元,我还发现有些新闻组的代码不完整,不起作用。

    我使用Delphi2007作为Win32。我可以使用什么从带有预定义参数的程序集动态执行函数?

    类似:

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

    我只想补充一点,我需要能够加载任意程序集(可能是特定文件夹中的所有程序集),因此创建一个C包装可能不起作用。

    7 回复  |  直到 6 年前
        1
  •  7
  •   Stefan Schultze    16 年前

    在绝地代码库(JCL)-免费-有一个jcldotnet.pas,包含一个Tjclrhost类,可能在做你想做的:

      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;
    
        2
  •  7
  •   Ian Boyd    6 年前

    自己托管CLR并不那么困难(特别是如果您只使用一个AppDomain)。您可以使用基于COM的宿主API来启动运行时、加载程序集、创建对象并对其调用方法。

    网上有很多信息,例如有关 Hosting the Common Language Runtime “。 ( new home )

        3
  •  6
  •   Jason Jackson    16 年前

    我可以从第一手的经验告诉你,与Delphi的.NET进行交互操作不是件轻松的事。我是一个.NET人,但在.NET和Delphi商店工作了一段时间。我管理了几个用.NET(winforms和wpf)编写但被delphi调用的项目。我们的Delphi开发人员已经为Delphi编写了一个互操作层,以调用.NET库,因为我们所有的新产品都是用.NET编写的。这对我们来说是个麻烦(这些都是优秀的Delphi开发人员)。如果我们可以买一个 好的 第三方图书馆要为我们做互操作,那就值得了。我敢打赌,我们花费了数千美元的工时来编写和调试从Delphi到.NET的互操作问题。

    我会带着管理的VLC库进行一次试驾,看看它的工作情况如何。如果它达到了广告的标准,那么它很容易就值250美元。

        4
  •  4
  •   Community holdenweb    7 年前

    my question 对于在Delphi中用JCL托管CLR的端到端示例。

        5
  •  3
  •   postfuturist    16 年前

    我也有同样的问题。我在一家Delphi商店工作,他们想用.NET和C为传统的Delphi应用程序添加功能。我看了管理VLC,决定跳过它,因为我觉得它有一些严重的问题。我在这里找到了更简单的东西: Delphi.NET . 注:这是 在.NET上本机运行的Delphi版本。这是一个开源项目,允许传统的Delphi应用程序通过COM和反射访问.NET功能。尽管它很旧,但它使用COM后仍像是一种魅力。我将验证它是否适用于.NET 2.0和3.5。我在几天内把.NET DLL完全集成到了我们的旧Delphi5应用程序中。我老板认为我是个超级英雄。祝你好运!

        6
  •  2
  •   zendar    16 年前

    在Delphi中,可以使用.NET类作为COM对象:

    • 在C中创建程序集#
    • 为程序集创建类型库
    • 在Delphi中导入类型库

    现在,您可以从.NET程序集访问在类型库中导出的类。

        7
  •  2
  •   Bruce McGee    16 年前

    您可以将delphi用于.NET和非托管导出,也称为reverse p/invoke。

    这基本上允许您创建一个.NET.dll,它具有对.NET框架的完全访问权限,但可以由任何本机语言加载,就像对任何.dll加载一样,并且不需要COM互操作的开销。

    下面是一个简单的例子: http://cc.codegear.com/Item/22688