Inicio > .NET, HTML, JavaScript > Crear DLL en C# .NET y llamarla desde JavaScript

Crear DLL en C# .NET y llamarla desde JavaScript

Hoy estaba creando un Gadget para Windows 7 con HTML y Javascript, Lo malo es que el gadget tenía que procesar mucho, por lo que aveces se pegaba el navegador, asi que se me ocurrio crear un programa en C# para que el procesamiento lo hiciera .NET y Javascript solo fuera el puente entre la parte grafica (HTML) y el proceso (.NET)….Para eso investigue sobre  librerías en .NET y Interoperabilidad COM lo que me parecio bastante útil he interesante ya que puedo ocupar una librería casi desde cualquier otro lenguaje. En este ejemplo mostraré como usar una DLL escrita en C# desde JavaScript.

Parte 1 Libreria C#

Bueno lo primero es Ejecutar Visual Studio como Administrador

Una vez abierto Nos vamos a :
File / New / Proyecto

Ahora elegimos Class Library y le damos un nombre a nuestro Proyecto

Ya ahora en la misma Class1 que nos auto generó empezaremos a programar. Lo primero es crear una GUID ,una clave que nos identificará nuestra librería, para eso vamos a
Tools / Crear GUID

Seleccionamos la opcion 2 Define GUID y presionamos el boton Copy

Lo que esta en verde claro es nuestra GUID.

Para que Class1 pueda ser visible desde el exterior es necesario importar System.Runtime.InteropServices y hacer unas declaraciones en la clase

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace TestLib {
    [ComVisibleAttribute(true)]  //Deja la clase visible para COM
    [Guid("134FC6AB-E594-4e5b-84F2-5CC612FF69D3")] //GUID que generamos, Identificador de la Libreria
    [ProgId("TestLib.Class")] //Identificador para poder Acceder a esta clase desde el exterior
    public class Class1 {
        public string Hola() {
            return "Hola Mundo desde .NET";
        }
    }
}

Una vez listo el código debemos ir a las propiedades del proyecto

Una vez dentro de las propiedades nos dirigimos a Generar y chequeamos la opción  Registrar para interoperabilidad COM.

Esto permitirá que al generar nuestro proyecto, la librería quede en el registro de windows de la maquina donde se generó, para así poderla ocupar.

Por ultimo generamos nuestra Libreria

------ Operación Generar iniciada: proyecto: TestLib, configuración: Debug Any CPU ------
C:\Windows\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /nowarn:1701,1702 /errorreport:prompt /warn:4 /define:DEBUG;TRACE /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll" /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Xml.Linq.dll" /debug+ /debug:full /filealign:512 /optimize- /out:obj\Debug\TestLib.dll /target:library Class1.cs Properties\AssemblyInfo.cs

Compile complete -- 0 errors, 0 warnings
TestLib -> C:\Users\Esteban\Documents\Visual Studio 2008\Projects\TestLib\TestLib\bin\Debug\TestLib.dll
========== Generar: 1 correctos o actualizados, 0 incorrectos, 0 omitidos ==========

Ahora vamos a la carpeta Bin/Debug de nuestro proyecto y debería encontrarse nuestra Librería

Parte 2 HTML + JavaScript

Con la DLL lista ahora solo queda programar la “interfaz gráfica”, en verdad solo mostraré el texto traído desde el método de la librería por una alerta xD

para ello es el siguiente código

<html>
	<head>
		<script type="text/javascript">
			/* Creando una instancia de ActiveXObject para poder acceder a nuestra libreria */
			var obj = new ActiveXObject("TestLib.Class"); /* ProgId de la Clase */
			alert(obj.Hola()); /* llamando al metodo Hola de la DLL */
		</script>
	</head>
	<body>
		<!-- Cuerpo -->
	</body>
</html>

El Anterior código lo guardaré, para testear, con extensión HTA


Y por ultimo Ejecutamos la aplication.hta y debería mostrarnos la alerta con el texto que retorna nuestra librería

Parte 3 Registro Manual para Interoperabilidad COM

Bueno mas de alguno debe preguntarse como es que se linquea la dll que generé (TestLib.dll) con ActiveXObject(“TestLib.Class”); porque no le paso la ruta de la libreria ni nada por el estilo. Bueno lo que hizo Visual Studio al generar el archivo TestLib.dll fue guardar en el registro de windows la ubicación de la DLL y lo asoció a TestLib.Class.
Entonces si ustedes Quieren Ocupar esta dll en sus maquinas no podrán porque en su registro no existe dicha asociación lanzandoles un error como éste:

Para que puedan testearla en sus pcs les dejo un archivo.reg que hice para registrar la DLL.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CLSID\{134FC6AB-E594-4e5b-84F2-5CC612FF69D3}]
@="TestLib.Class1"
[HKEY_CLASSES_ROOT\CLSID\{134FC6AB-E594-4e5b-84F2-5CC612FF69D3}\InprocServer32]
@="mscoree.dll"
[HKEY_CLASSES_ROOT\CLSID\{134FC6AB-E594-4e5b-84F2-5CC612FF69D3}\InprocServer32]
"Assembly"="TestLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
[HKEY_CLASSES_ROOT\CLSID\{134FC6AB-E594-4e5b-84F2-5CC612FF69D3}\InprocServer32]
"Class"="TestLib.Class1"
[HKEY_CLASSES_ROOT\CLSID\{134FC6AB-E594-4e5b-84F2-5CC612FF69D3}\InprocServer32]
"CodeBase"="file:///C:/JavaScript + Libreria C Sharp/TestLib.dll"
[HKEY_CLASSES_ROOT\CLSID\{134FC6AB-E594-4e5b-84F2-5CC612FF69D3}\InprocServer32]
"RuntimeVersion"="v2.0.50727"
[HKEY_CLASSES_ROOT\CLSID\{134FC6AB-E594-4e5b-84F2-5CC612FF69D3}\InprocServer32]
"ThreadingModel"="Both"
[HKEY_CLASSES_ROOT\CLSID\{134FC6AB-E594-4e5b-84F2-5CC612FF69D3}\InprocServer32\1.0.0.0]
"Assembly"="TestLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
[HKEY_CLASSES_ROOT\CLSID\{134FC6AB-E594-4e5b-84F2-5CC612FF69D3}\InprocServer32\1.0.0.0]
"Class"="TestLib.Class1"
[HKEY_CLASSES_ROOT\CLSID\{134FC6AB-E594-4e5b-84F2-5CC612FF69D3}\InprocServer32\1.0.0.0]
"CodeBase"="file:///C:/JavaScript + Libreria C Sharp/TestLib.dll"
[HKEY_CLASSES_ROOT\CLSID\{134FC6AB-E594-4e5b-84F2-5CC612FF69D3}\InprocServer32\1.0.0.0]
"RuntimeVersion"="v2.0.50727"
[HKEY_CLASSES_ROOT\CLSID\{134FC6AB-E594-4e5b-84F2-5CC612FF69D3}\ProgId]
@="TestLib.Class"
[HKEY_CLASSES_ROOT\TestLib.Class]
@="TestLib.Class1"
[HKEY_CLASSES_ROOT\TestLib.Class\CLSID]
@="{134FC6AB-E594-4e5b-84F2-5CC612FF69D3}"

Eso lo guardan como InteroperabilidadCOM.reg lo ejecutan y luego de ejecutarlo se supone que debería funcionales en sus maquinas la DLL, ya que fue registrada.

Ojo:

"CodeBase"="file:///C:/JavaScript + Libreria C Sharp/TestLib.dll"

Deben cambiar C:/JavaScript + Libreria C Sharp/TestLib.dll por la ruta donde ustedes tengan la DLL.

Con esto se puede ampliar mucho mas la capacidad de sus aplicaciones porque ahora no es solamente javascript sino que tiene por debajo el poder y fortaleza de .NET y su gran cantidad de clases y librerías ademas de su rápido procesamiento.

Código de Fuente:

http://estebanfuentealba.net/ejemplos/JavaScript + Libreria C Sharp.rar

Espero que les sirva esto, es solo una idea xD

Saludos!

  1. OSKR
    abril 19, 2010 a las 12:59 pm

    Hola Esteban, excelente informacion? , tengo una duda, en el menú propiedades de la aplicación en visual, aparece ya las opciones de “Dejar visible para COM” y también un sección “Assembly information” donde ya viene un GUID. ¿Es necesario crear otro GUID como tu lo explicas?¿ES necesario incluir estas opciones en el codigo aun cuando ya existen en las propiedades de la aplicación?. ¿Existe algún otro modo de generar el archivo .reg? De antemano Gracias

  2. Manuel
    julio 23, 2010 a las 9:09 pm

    COMO QUISIERA PROGRAMAR ASI COMO TU LO HACES ERES UN DIOS…………

    Ahora en serio porfavor se que es mucha molestias pero podrias decirme como podria empezra a programar es que me encanta la programacion pero todavia no he echo un triste programa solo paginas webs que me han quedado muy bien nada mas :( porfavor dime como empezaria a aprender aprogramar pero de manera efectiva y facil porque tengo como 400 manuales y no entiendo ninguno :( Silo haces te lo agradecere siempre en serio y estare en deuda. un saludo

  3. Cristian
    julio 25, 2011 a las 5:27 pm

    Está muy bien el paso a paso, con respecto a la “Parte 3 Registro Manual para Interoperabilidad COM” sólo quiero agregar que todos esos pasos manuales que indicas para hacer el registro manual de la librería se pueden automatizar con una aplicación provista por Visual Studio, para ello debes:
    1- Abrir “símbolo del sistema de Visual Studio” que se encuentra dentro del menú Tools del menú MS Visual Studio 20XX.
    2- Cambiar a la carpeta donde está compilando el ensamblado. En el caso de Esteban: “C:\Users\Esteban\Documents\Visual Studio 2008\Projects\TestLib\TestLib\bin\Debug”
    3- Tipear “regasm.exe TestLib.dll /tlb /codebase” y luego presionar Enter.

    Estos tres pasos simplifican toda la registración manual para la Interoperabilidad COM.

  4. David
    enero 28, 2012 a las 9:05 pm

    Tal cual comenta Cristian. Es la manera mas comoda. Asi lo hago en el laburo. Agrego que si no estas en el visual studio, entras al cmd, te ubicas dentro de la carpeta C:\Windows\Microsoft.NET\Framework\v2.0.50727 y ejecutas el regasm “la direcion de la dll” /codebase /tlb y si la queres sacar del registro le tiras /u

    Luego si quieres actualizar la dll, solo la reemplezas en el lugar donde esta registrada y listo.No hace falta “desregistrar” y registrar para cambiar la dll ya que en el registro de windows se guarda la ruta del archivo, para que el resto de las aplicacion puedan buscarla, nada mas.

  5. Johana Torres
    octubre 24, 2012 a las 5:29 pm

    hola Esteban una pregunta como generaro la Libreria, cuando la realizo por debug, me aparece un error.
    “a project with an output type of class library cannot be started directly in order to debug project”

  6. Sim
    febrero 20, 2013 a las 4:29 pm

    esta muy bien el articulo, de hecho lo probe y funciona, la duda aqui es, si es para aplicarla en una pagina asp clasico, le registro de las dll hay que hacerlo en cada estacion donde quieran abrir la pagina?

  7. septiembre 20, 2013 a las 3:52 pm

    es muy bueno pero no me funciona ni de una ni de otra manera, la unica solucion me parece instalar el visual studio pero sin este no puedo registrar la dll. Ni manualmente pude. tengo windows server 2012

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: