Voy a explicar los pasos para poder crear una DLL en C# usando Visual Studio, y que dicha DLL pueda ser usada desde otro lenguaje de programación, en este caso Power Builder (PB). Como digo, podrá ser utilizada desde cualquier otro lenguaje de programación, porque la DLL será creada como un componente COM.
Presupongo que el lector ya sabe crear, compilar y ejecutar un proyecto vació y básico desde ambos lenguajes :)
En Visual Studio:
Creamos un nuevo proyecto C# para Windows de tipo Biblioteca de clases, y ponemos correctos (o si prefieres puedes dejar los nombres por defecto) el nombre de fichero y nombre de clase que establece Visual Studio por defecto.
Abrimos las propiedades de nuestro proyecto -> Aplicación -> Información de ensamblado... -> Marcar el checkbox de "Crear ensamblado visible a través de COM"
Volvemos de nuevo a la pantalla principal de las propiedades, ahora nos vamos a Firma, marcamos "Firmar el ensamblado" y nos creamos una nueva firma.
Dejamos el código fuente de la clase de la siguiente manera (en negrita marco lo más importante):
Los códigos de GUID se pueden obtener con alguna de las herramientas de Microsoft Visual Studio, o bien desde alguna web tipo http://www.guidgen.com/
Una vez hecho esto, compilamos el proyecto y nos aseguramos que no haya ningún error.
Lo más probable es que queramos distribuir la DLL en otros PCs, junto al programa realizado en Power Builder, para ello pasaremos a agregar/crear un nuevo proyecto instalador tipo "Otros tipos de proyectos" -> "Instalación e implementación" -> "Instalador de Visual Studio" -> "Proyecto de instalación"
En el nuevo proyecto instalador, agregaremos los resultados del proyecto de la clase de la DLL; y lo más importante, en las propiedades del resultado principal de dicha clase, especificaremos la propiedad Register a vsdrpCOM.
Generamos el nuevo proyecto instalador, y pasaríamos a instalar la DLL en el equipo.
Nota: Es posible que en Visual Studio, cuando generemos el instalador, se nos presente un mensaje tipo Visual Studio registry capture utility has stopped working o Visual Studio registry capture utility dejo de funcionar, para solucionarlo:
En PowerBuilder:
Simplemente instanciaremos en nuestro código fuente la DLL COM de la siguiente manera:
Y... ¡listo! :)
Webs de referencia:
Presupongo que el lector ya sabe crear, compilar y ejecutar un proyecto vació y básico desde ambos lenguajes :)
En Visual Studio:
Creamos un nuevo proyecto C# para Windows de tipo Biblioteca de clases, y ponemos correctos (o si prefieres puedes dejar los nombres por defecto) el nombre de fichero y nombre de clase que establece Visual Studio por defecto.
Abrimos las propiedades de nuestro proyecto -> Aplicación -> Información de ensamblado... -> Marcar el checkbox de "Crear ensamblado visible a través de COM"
Volvemos de nuevo a la pantalla principal de las propiedades, ahora nos vamos a Firma, marcamos "Firmar el ensamblado" y nos creamos una nueva firma.
Dejamos el código fuente de la clase de la siguiente manera (en negrita marco lo más importante):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace Test
{
[Guid("F8E03FC1-3367-4d4a-AD49-EF3EAEBFA6EC")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface _CTest
{
void Test();
void Test2();
}
[Guid("F8E03FC1-3367-4d4a-AD49-EF3EAEBFA6EC")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Test.CTest")]
public class CTest : _CTest
{
public void Test()
{
MessageBox.Show("Hola, yo soy Test()");
}
public void Tes2t()
{
MessageBox.Show("Hola, yo soy Test2()");
}
}
}
Los códigos de GUID se pueden obtener con alguna de las herramientas de Microsoft Visual Studio, o bien desde alguna web tipo http://www.guidgen.com/
Una vez hecho esto, compilamos el proyecto y nos aseguramos que no haya ningún error.
Lo más probable es que queramos distribuir la DLL en otros PCs, junto al programa realizado en Power Builder, para ello pasaremos a agregar/crear un nuevo proyecto instalador tipo "Otros tipos de proyectos" -> "Instalación e implementación" -> "Instalador de Visual Studio" -> "Proyecto de instalación"
En el nuevo proyecto instalador, agregaremos los resultados del proyecto de la clase de la DLL; y lo más importante, en las propiedades del resultado principal de dicha clase, especificaremos la propiedad Register a vsdrpCOM.
Generamos el nuevo proyecto instalador, y pasaríamos a instalar la DLL en el equipo.
Nota: Es posible que en Visual Studio, cuando generemos el instalador, se nos presente un mensaje tipo Visual Studio registry capture utility has stopped working o Visual Studio registry capture utility dejo de funcionar, para solucionarlo:
- Localiza regcap.exe en: C:Program FilesMicrosoft Visual Studio 9.0Common7ToolsDeployment (o similar)
- Botón derecho sobre el fichero y selecciona "Propiedades".
- Selecciona la pestaña de "Compatibilidad"
- Marca el checkbox de modo de compatibilidad y selecciona Windows Vista SP2.
- Marca el checkbox de ejecutar como administrador.
En PowerBuilder:
Simplemente instanciaremos en nuestro código fuente la DLL COM de la siguiente manera:
iole = CREATE OLEObject
li_rc = iole.ConnectToNewObject("Test.CTest")
IF li_rc <> 0 THEN
DESTROY iole
END IF
Y... ¡listo! :)
Webs de referencia:
- http://anvil-of-time.com/wordpress/powerbuilder/powerbuilder-accessing-c-classes-via-com-to-capture-a-screenshot/
- http://stackoverflow.com/questions/3360160/how-do-i-create-an-activex-com-in-c
- http://www.guidgen.com/
- http://stackoverflow.com/questions/2334005/visual-studio-registry-capture-utility-has-stopped-working-error-compiling-c-sh
Buen artículo.
ResponderEliminar¡Gracias!, muy útil, me salvó la vida.
Excelente, eres un genio.
ResponderEliminar