Ir al contenido principal

Crear una DLL (COM) en Visual Studio C# para que sea visible desde Power Builder (PB)

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):
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:

  1. Localiza regcap.exe en: C:Program FilesMicrosoft Visual Studio 9.0Common7ToolsDeployment (o similar)

  2. Botón derecho sobre el fichero y selecciona "Propiedades".

  3. Selecciona la pestaña de "Compatibilidad"

  4. Marca el checkbox de modo de compatibilidad y selecciona Windows Vista SP2.

  5. 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:

  1. http://anvil-of-time.com/wordpress/powerbuilder/powerbuilder-accessing-c-classes-via-com-to-capture-a-screenshot/

  2. http://stackoverflow.com/questions/3360160/how-do-i-create-an-activex-com-in-c

  3. http://www.guidgen.com/

  4. http://stackoverflow.com/questions/2334005/visual-studio-registry-capture-utility-has-stopped-working-error-compiling-c-sh


 

 

 

 

Comentarios

  1. Buen artículo.

    ¡Gracias!, muy útil, me salvó la vida.

    ResponderEliminar
  2. Excelente, eres un genio.

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Cosmic Supremacy : Juego 4X online, gratuito y multijugador basado en conquistas espaciales

  Llevaba bastante tiempo buscando un juego de estrategia en el espacio, multijugador , y que fuera por turnos . Un requisito que siempre tuve es que fuera fácil aprenderlo, y tuviera suficiente ayuda o tutoriales. Creo que lo he encontrado, se llama Cosmic Supremacy , y es gratis . Os dejo aquí información traducida desde su web oficial por si os animáis :) ¿Qué es Cosmic Supremacy? Cosmic Supremacy es un juego gratuito de estrategia espacial multijugador masivo basado en ticks/turnos con una interfaz 3D 'Galaxy View'. Compartes una galaxia con cientos de jugadores, cada uno con su propia civilización alienígena. Algunos de ellos pueden llegar a ser tus enemigos, otros podrían ser tus aliados. Necesitas explorar la galaxia que te rodea, descubrir nuevos sistemas solares, colonizar nuevos planetas y expandir tu imperio. Puedes diseñar todas las naves de tu flota e investigar nuevas tecnologías avanzadas para poder construir naves más rápidas y fuertes que te darán la ventaja ...

Hacer una pausa en un fichero por lotes batch (bat o cmd)

En consola de Windows (antiguamente Ms-Dos) desde siempre se ha podido hacer una pausa, esperando confirmación del usuario. El comando en cuestión es: pause Si escribimos pause en nuestra consola veremos que la consola se queda pausada hasta que pulsamos una tecla. Esto es útil en ficheros batch (ya sean .bat o .cmd) para hacer pausas controladas entre distintos comandos, a la espera que el usuario pulse alguna tecla para continua. Pero, ¿qué ocurre si queremos una pausa de cierto número de segundos y luego continúe el proceso automáticamente ? No hay ningún comando que lo haga, pero haciendo el siguiente "truco" (hace un ping a una URL especificando el número de segundos como timeout) lo podremos conseguir ping -n 10 localhost > null Simplemente cambiar el 10 por el número de segundos que queráis, y ya tendréis en consola (o msdos) una pausa de N segundos, y luego el proceso continuará automáticamente.  

Fraude SEUR SMS

Quería comentar y advertir de los cada vez más casos de fraude vía SMS que se están sufriendo relativos a entregas de paquetes. Cada vez es más normal que tengamos varios pedidos pendientes de entrega y no nos acordemos de todos de cabeza, y si recibimos un SMS relacionado con algún pedido, pinchemos en el enlace, ¡mucho cuidado! Hoy mismo he recibido este mensaje SMS en mi móvil: SEUR: envio 7770722 de LETMEKNOW no entregado por ausencia en domicilio. Programe nueva entrega en <página web> No especifico la URL de la página web que venía en el SMS por seguridad que nadie clique ahí. Desde el princiio esto me sonó a fraude más que a equivocación, primero porque no esperaba ningún paquete, segundo porque estaba en casa cuando recibí el SMS, y finalmente la página web me resultó sospechosa, ni siquiera era https... Al recibir el SMS busqué el número de teléfono desde el que me lo habían enviado, no obtuve ninguna información. Después busqué "SMS LETMEKNOW" y llegue a un ar...