.net delphi winapi com interop

Alojando el tiempo de ejecución.NET en un programa Delphi



winapi com (7)

Hospedar el CLR usted mismo no es tan difícil (especialmente si solo está usando un dominio de aplicación único). Puede utilizar las API de alojamiento basadas en COM para iniciar el tiempo de ejecución, cargar ensamblajes, crear objetos e invocar métodos sobre ellos.

Hay mucha información en línea, por ejemplo, la documentación de MSDN sobre " Hosting Common Language Runtime ".

Estaba buscando el uso de algún código .NET desde dentro de un programa Delphi. Tendré que hacer que mi programa sea extensible usando ensamblados .net y funciones predefinidas (ya soporto DLL regulares).

Después de una gran cantidad de búsquedas en línea, encontré Managed-VCL , pero no estoy listo para pagar $ 250 por lo que necesito, también encontré algunos grupos de noticias con código que está incompleto y no funciona.

Estoy usando Delphi 2007 para win32. ¿Qué puedo usar para ejecutar dinámicamente una función desde un ensamblaje con parámetros predefinidos?

Algo como:

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

Solo quiero agregar que necesito poder cargar un ensamblaje arbitrario (quizás todos los ensamblajes en una carpeta específica), por lo que la creación de un contenedor C # puede no funcionar.


Puede usar Delphi para exportaciones .Net y no gestionadas, también llamado P / Invoke inverso.

Esto esencialmente le permite crear un .dll .Net que tenga acceso completo al .Net framework, pero puede ser cargado por cualquier idioma nativo, como lo haría con cualquier archivo .dll, y sin la sobrecarga de com interop.

Aquí hay un ejemplo simple: http://cc.codegear.com/Item/22688


Puedes usar clases .Net como objetos COM en Delphi:

  • crear ensamblaje en C #
  • crear tipo de biblioteca para ensamblar
  • biblioteca de tipo de importación en Delphi

Ahora puede acceder a las clases desde el ensamblado .Net que se exportan en la biblioteca de tipos.


Puedo decirles de primera mano que interoperar con .Net de Delphi no es un picnic. Soy un chico de .Net, pero trabajé en una tienda .Net y Delphi por un tiempo. Administré varios proyectos que fueron escritos en .Net (WinForms y WPF) pero fueron llamados por Delphi. Nuestros chicos de Delphi habían escrito una capa de interoperabilidad para que Delphi llamara a las bibliotecas .Net ya que todos nuestros nuevos productos se escribían en .Net. Fue un problema para nosotros (y estos fueron buenos desarrolladores de Delphi). Si pudiéramos haber comprado una buena biblioteca de terceros para hacer la interoperabilidad para nosotros, habría valido la pena. Apuesto a que gastamos miles de dólares en problemas de escritura y depuración de horas hombre con la interoperabilidad de Delphi a .Net.

Tomaría esa biblioteca Managed-VLC para una prueba de manejo para ver qué tan bien funciona. Si está a la altura de su publicidad, vale fácilmente los $ 250.


Tenía exactamente el mismo problema. Trabajé en una tienda Delphi y querían comenzar a agregar funcionalidad a una aplicación heredada de Delphi con .NET y C #. Miré Managed-VLC y decidí omitirlo, ya que sentía que tenía serios problemas. Encontré algo mucho más simple aquí: Delphi.NET . Nota: esta no es la versión de Delphi que se ejecuta nativamente en .NET. Este es un proyecto de código abierto para permitir que las aplicaciones heredadas de Delphi accedan a la funcionalidad .NET a través de COM y reflexión. A pesar de que es viejo, funciona como un encanto ya que usa COM. Verificare que funcione con .NET 2.0 y 3.5. Obtuve .NET DLL totalmente integrado en nuestra aplicación heredada Delphi 5 en días. Mi jefe pensó que era un superhéroe. ¡Buena suerte!


En Jedi Code Library (JCL) - gratis - hay un JclDotNet.pas, que contiene una clase TJclClrHost, probablemente haciendo lo que quieras:

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;


Vea mi pregunta para el ejemplo de extremo a extremo de CLR de hosting en Delphi con JCL.