Cree una DLL de C#que se pueda importar en una aplicación Delphi usando stdcall-¿Posible?
delphi-2007 (9)
Debe hacer que el ensamblado (= C # DLL) sea accesible para COM, que se llama Interop.
Consulte el ensamblado de artículos de MSDN para la conversión de biblioteca de tipos y empaquetado de un ensamblaje para COM, que describe los antecedentes técnicos y las utilidades para realizar las operaciones requeridas.
Tengo un programa para el que necesito crear una DLL, con suerte en C #. El programa está escrito en Delphi y tengo un archivo de interfaz para codificarlo. La interfaz utiliza la convención de llamadas stdcall.
¿Es posible crear una DLL C # que se ajuste a la interfaz y se pueda usar en la aplicación Delphi?
¿Hay algún código de muestra que demuestre cómo codificar la DLL C # en un método de interfaz stdcall?
Eche un vistazo a Hydra
Esto no es directamente posible. C # es código administrado. Esto significa que requiere un entorno de tiempo de ejecución muy específico para funcionar, un entorno que Delphi no pudo proporcionarle directamente. No es como C, donde simplemente encuentras la dirección y la convención de llamada de la función y la llamas.
Sin embargo, es posible alojar Common Language Runtime dentro de una aplicación Delphi (o cualquier otra aplicación de Windows). No tengo ni idea de cómo hacer esto. Solo sé que es posible. (Es bastante probable que eso sea lo que hará esta "Hidra" que mencionó Steve).
Estoy bastante seguro de que esto no puede hacerse directamente. Deberá escribir una capa en C ++ / CLI o exponer el código C # como una interfaz ActiveX. Pero esa segunda opción puede no coincidir con su interfaz.
He estado en este camino antes. La solución que escogí fue crear un NUEVO conjunto de C # (más tarde porté esto a Prism) que expuso a través de interoperabilidad la funcionalidad que necesitaba alcanzar. Descubrí que mediante el uso del boxeo negro las llamadas de API en algo más simple, pude reducir el número de clases con las que tuve que lidiar a través de la barrera de interoperabilidad.
Miré a Hydra, pero fue demasiado para lo que estaba tratando de hacer ... que era acceder a un SDK de terceros que se presentaba en ensamblajes de .net para procesar datos. Si está buscando integrar la funcionalidad (objetos gui, ect) en su aplicación, entonces debe darle consideración a Hydra.
Utilicé Managed.VCL para una versión muy temprana del sistema, pero luego lo abandoné por el enfoque de interoperabilidad de Prism / C # com que era más simple de implementar y más estable.
Por curiosidad, ¿por qué esperas escribir un .dll que esté destinado a ser utilizado desde una aplicación nativa en C #?
Managed C ++, Delphi for .Net y ahora Delphi Prism lo soportan de manera inmediata utilizando exportaciones no gestionadas. Por diseño, C # y VB.net no. No estoy seguro por qué. Pero como mencionó Cobus, puedes pensar en esto. Hazlo bajo tu propio riesgo.
Además de Hydra de RemObjects, AToZed presenta CrossTalk .
Encontré una publicación de Robert Giesecke en los grupos de noticias Delphi Prism. En él, anuncia un proyecto que puede agregar a una solución que le permite exportar funciones arbitrarias desde una DLL .Net simplemente agregando el atributo DllExport
. Admite la clasificación como DllImport
. Lo demuestra con un proyecto de Prism, pero imagino que también funcionaría en las clases de C #. La publicación se realizó en marzo, por lo que no estoy seguro de si el archivo adjunto aún estará disponible. El lanzamiento de Prism en mayo obvia esta herramienta, ya que admite las exportaciones no gestionadas por sí mismo.
Esto no es posible en C # puro, pero este es un artículo que muestra cómo agregar una tabla de exportación no administrada a su biblioteca C #, que luego puede usarse en cualquier otro idioma. Tenga en cuenta que las hordas de referencias a Blitz no deberían desanimarlo: se relacionan con el contexto del autor y no tienen nada que ver con el concepto básico y la forma en que funciona.
También hay una sección en el documento de una conferencia de Brian Long . En un giro que podría parecer algo irónico, Delphi.Net en realidad soportaba exportaciones no gestionadas directamente a pesar de que C # no lo hacía. No tengo idea si esto también es cierto para Delphi Prism.
Supongo que la aplicación Delphi no es una aplicación basada en .NET y, por lo tanto, debe alojar el tiempo de ejecución .NET en un proceso Win32.
- Alojando el tiempo de ejecución .NET en un programa Delphi
- Interoperabilidad .Net - usando el ensamblaje C # de Delphi Win32
- CorBindToRuntimeEx
CorBindToRuntimeEx es una función dentro de MSCorEE.dll, que contiene el tiempo de ejecución de .NET. Con él puede alojar el tiempo de ejecución y luego crear objetos dentro de él e interactuar con ellos.