2008-11-03 14 views
12

Estaba buscando usar 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).Alojando el tiempo de ejecución de .NET en un programa Delphi

Después de mucha búsqueda 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 así como:

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

sólo quiero añadir que tengo que ser capaz de agregar una carga asambleas arbitrarias (tal vez todas las asambleas en una carpeta específica), por lo que la creación de un C# envoltorio puede no funcionar.

Respuesta

7

En la biblioteca de códigos Jedi (JCL) - gratis - no es un JclDotNet.pas, que contiene una TJclClrHost clase, probablemente haciendo lo que quiere:

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

¿Estoy ciego o no tengo ningún ejemplo de cómo usarlo? –

2

Puede utilizar clases de .NET como objetos COM en Delphi:

  • crear el montaje en C#
  • crear biblioteca de tipos para el montaje
  • biblioteca de tipos
  • importación en Delphi

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

6

Le puedo decir de primera mano que la interoperatividad con .Net de Delphi no es nada fácil. 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 con nosotros, hubiera 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.

Me gustaría llevar 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.

7

Alojar el CLR usted mismo no es tan difícil (especialmente si solo está usando un solo dominio de aplicación). 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 en "Hosting the Common Language Runtime".

+0

Aparece un 'No se pudo cargar el archivo o ensamblado 'RGiesecke.DllExport.Metadata, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = ad5f9f4a55b5020b' o una de sus dependencias. El sistema no puede encontrar el archivo especificado. 'Estoy usando ese paquete debido a la anotación '[DllExport]'. Pregunta [aquí] (http://stackoverflow.com/q/23383839/675577) – dialex

3

Tuve 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: esto es no 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 de .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!

2

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 .dll, y sin la sobrecarga de com interop.

Aquí está un ejemplo sencillo: http://cc.codegear.com/Item/22688

4

Ver my question para el ejemplo de extremo a extremo de alojamiento CLR en Delphi con JCL.

Cuestiones relacionadas