Comunicación entre C# y Delphi con ComObject COM+
Artículo de programción C# .NET y Delphi
Cuando realizamos una DLL (Library) con Delphi y la queremos cargar en C#, uno de los aspectos que tenemos que tener en cuenta son los strings, pero eso es cuestión de hablar en otro artículo. El artículo de hoy va destinado a poder realizar un Assembly en C# .NET para poderlo utilizar en Delphi.
Para conseguir establecer una comunicación entre una Biblioteca de Clases (DLL) en C# y un proyecto en Delphi, debemos seguir los pasos enumerados a continuación
- En C#: Crear un proyecto como Biblioteca de Clases, donde se irán acumulando las clases que queremos envolver.
- En C#: Abrir las Propiedades del Proyecto y en la pestaña de “Depurar” marcar “Depurar para la interopabilidad COM”
- En C#: Abrir el fichero AssemblyInfo.cs y en donde pone ComVisible(false) cambiarlo por ComVisible(true)
- En C#: Para que el Objeto COM tenga efecto debe tener un constructor de Clase sin parámetros.
- En C#: Definir una Interfaz que la clase que queremos exportar deberá cumplir con dicho contrato. Así a la hora de utilizarla será mucho más sencillo.
- Cada vez que compilemos se generará un TLB junto a la DLL.
- En Delphi: Copiar el TLB al directorio del proyecto, y dirigirnos a “Proyect -> Import Type Library” Clickar en “ADD”, Seleccionar el TLB y pulsar sobre Create Unit.
- En Delphi: Ahora ya podemos usar el Objecto COM desde Delphi, y para usarlo, tenemos el siguiente ejemplo
Uses *_TLB y ComObj
—-
[csharp]
//Código Delphi
Var
Com : ISomeInterface
Begin
Com := CreateComObject(CLASS_SomeInterface_) as ISomeInterface;Com.SomeMethod;
…
End
[/csharp]
Con esta guia podrás Cargar una Dll de .Net en Delphi
Si tenéis dudas no tenéis ponerme un comentario.
Espero ser de ayuda.
Yo estoy tratando de trabajar una dll de C# en delphi pero me marca un error ISomeInterface me dice no esta declarada, debe tener alguna libreria?, o que es lo que debo de hacer? me podrias ayudar por favor?
@Alis, Tienes que declarar una Interfaz que debe cumplir la Librería (Clase) que quieres compartir con Delphi. Declara la Interfaz tipo “public Interface INombreInterfaz { … }”, con la Declaración de los métodos que quieras compartir.
Después la Clase tiene que implementar dicha Interfaz tipo “public class NombreClase: INombreInterfaz { … }.
De esta forma debería generarte el TLB, y crearte una Unit en Delphi que puedas utilizar.
Espero Ayudarte.
Gracias por contestarme pero sigo con el problema, declare IsomeInterface asi ISomeInterface = class(TInterfacedObject); y ya no me marca error en mi metodo
var TCom : ISomeInterface;
Begin
If TCom = Nil then
Begin
TCom := CreateComObject(CLASS_N) as ISomeInterface;
End;
end;
pero me marca este error: operator not applicable to this operand type, no se que es lo que estoy omitiendo, espero que me puedas ayudar, por favor
@Alis, (intentare de memoria que no tego el VS), Declara en C# encima de la clase, public Interface ISomeInterface { void someMethod(); }. en la clase
public Class MyClass : ISomeInterface { public MyClass() { //constructor } public void SomeMethod() { //ToDo lo que quieras } }.
Sigues los puntos 2 y 3. Cuando Compiles tiene que haberte creado un fichero TLB en la carpeta Debug.
Despues en Delphi, sigues el punto 7, al importar el fichero TLB, y decirle que te cree una Unit, te crea una Unit que implementa la Interfaz ISomeInterface, después sólo tienes que usarla como te dice.
La declaracion de la interface no tienes que hacerla tu, te la hace el propio Delphi, despues tiene que usar es nueva Unit enla tuya.
Espero ser de ayuda