5

Después de revisar varios artículos diferentes y no encontrar nada especialmente concluyente que me lleve paso a paso a través del proceso, he venido buscando ayuda .Creando una biblioteca de interoperabilidad COM para ASP Classic usando el framework 4.0 y Visual Studio 2010

El Escenario

Un cliente mío sólo es competente en el desarrollo de ASP Classic. Recientemente han adquirido una cuenta para un sitio escrito originalmente en ASP.NET. Están convirtiendo el sitio en algo que pueden mantener activamente, pero el sitio originalmente incluía un manejador de imágenes que tomaba dinámicamente datos cambiantes con respecto a los niveles de agua y generaba una imagen que contenía una representación gráfica de esos datos. El requisito es desarrollar una biblioteca de interoperabilidad COM que pueda registrarse en el servidor y llamar con CreateObject para generar la matriz de bytes de la misma imagen para el resultado usando Response.BinaryWrite. La biblioteca de interoperabilidad COM debe estar registrada en el sitio remoto en un servidor de Windows 2000, y no puedo suponer que tengan acceso a regasm/gacutil para llevar a cabo esa tarea.

la dificultad

he construido la biblioteca de clases mediante la creación de un proyecto de biblioteca de clases en Visual Studio 2010, la elección de "Clase COM" de la plantilla, y la inserción de código para generar una clase con un único método público para devolver una matriz de bytes cuando se le da un número entero (bueno, enumerador, pero de todos modos). Desafortunadamente, incluso en mi propia máquina de desarrollo después de construir la biblioteca y registrar (regasm) y almacenar en caché el ensamblado (gacutil), no puedo hacer una llamada a través de Classic ASP para crear una instancia del objeto, recibiendo un componente "ActiveX que no puede crear objeto "error". Y, por supuesto, en el sitio del servidor, el archivo DLL no se puede registrar, la respuesta es "No se encontró el módulo obligatorio".

Recursos He usado

ya he tenido una mirada a través de los siguientes artículos y no han aparecido las respuestas que necesito:

  1. (pasos básicos) Walkthrough: Creating COM Objects with Visual Basic
  2. Build and Deploy a .NET COM Assembly
  3. .NET COM+ Interop Component with Classic ASP

lo que necesito

Esencialmente lo que necesito es un poco de mano de retención en una especie de paso a paso de lo que va a tomar para cumplir con los requisitos y crear un módulo COM+ interoperabilidad correctamente en Visual Studio 2010. Crear el objeto de clase real en sí mismo no es terriblemente difícil.

Sin embargo, ninguno de los artículos que he analizado realmente discute opciones de proyecto o procedimientos de compilación con Visual Studio 2010 o .NET 4.0 Framework, ni ninguno de ellos realmente se discutió si hay consideraciones especiales para implementar en sistemas anteriores como Windows Server 2000 y el registro real de la biblioteca en un sistema con solo, por ejemplo, regsvr32 disponible.

+0

Para todos aquellos que vienen detrás: Al hacer un poco más la tarea, yo quería hacer notar aquí que también necesitaba orientar mi biblioteca para el .NET Framework 2.0 ya que es el último marco con el apoyo de Windows Server 2000. – lsuarez

Respuesta

11

Debe ser bastante sencillo obtener un básico.NET ensamblado expuesto a COM - Nunca he probado la plantilla de proyecto de clase COM, así que esta es la forma en que lo he manejado en el pasado:

Crear una nueva biblioteca de clase .NET (estándar de pantano) usando C# o VB . Definir una interfaz COM (reemplace GUID con su propia):

[ComVisible(true)] 
[Guid("8999F93E-52F6-4E29-BA64-0ADC22A1FB11")] 
public interface IComm 
{ 
    string GetMyGroups(); 
} 

Ahora definir una clase que implementa la interfaz (de nuevo, sustituya GUID con su propia):

[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.None)] 
[GuidAttribute("C5C5A1A8-9BFB-4CE5-B42C-4E6688F6840B")] 
[ProgId("Test.Comm.1")] 
public class Comm : IComm 
{ 
    public string GetMyGroups() 
    { 
     var comm = new CommunicatorAPI.MessengerClass(); 

     var groups = comm.MyGroups as IMessengerGroups; 
     return string.Join(", ", groups.OfType<IMessengerGroup>().Select(g => g.Name).ToArray()); 
    } 
} 

El atributo ID de Prog en este clase es lo que usará para crear una instancia de su componente de ASP.

nombrar Muy en el ensamblaje de

(Propiedades del proyecto - pestaña> "firma" -> "Firmar el ensamblado" -> Crear un nuevo archivo de clave de nombre usando el desplegable)

Ahora, la construcción de la asamblea, y registrar usando Regasm - si no desea registrarse en el GAC (lo cual recomendaría, ya que no GACing simplifica la implementación), asegúrese de usar el parámetro -Codebase (esto simplemente agrega una entrada de registro que le dice a los clientes dónde encontrar el montaje) - por ejemplo:

regasm ClassLibrary2.dll /codebase "S:\Testing\ClassLibrary2\ClassLibrary2\bin\Debug\ClassLibrary2.dll" 

Ahora usted debería ser capaz de crear una instancia del componente, y llamar a métodos en él - por ejemplo (i n javascript):

var a = new ActiveXObject("Test.Comm.1"); 
alert(a.GetMyGroups()); 

Cuando se trata de la implementación, el importante trabajo que Regasm y Regsvr32 hacer es escribir varios ajustes en el registro, por lo que los clientes pueden encontrar el componente COM (basado en ID de Prog, o COM Identificador de clase). Todo lo que necesita hacer es averiguar qué configuraciones COM se están escribiendo cuando ejecuta Regasm en su equipo local, y escribirlas en el registro en el servidor. Puede usar ProcMon para monitorear lo que se escribe en el registro cuando se ejecuta Regasm.

En términos generales, se puede esperar para ver algo como esto escribe en el registro:

[HKEY_CLASSES_ROOT\Test.Comm.1] 
@="ClassLibrary2.Comm" 

[HKEY_CLASSES_ROOT\Test.Comm.1\CLSID] 
@="{00585504-90C8-4760-A359-67CAF08FFED1}" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}] 
@="ClassLibrary2.Comm" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\Implemented Categories] 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}] 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\InprocServer32] 
@="mscoree.dll" 
"ThreadingModel"="Both" 
"Class"="ClassLibrary2.Comm" 
"Assembly"="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf55d4e60653257a" 
"RuntimeVersion"="v4.0.30319" 
"CodeBase"="file:///S:/Testing/ClassLibrary2/ClassLibrary2/bin/Debug/ClassLibrary2.DLL" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\InprocServer32\1.0.0.0] 
"Class"="ClassLibrary2.Comm" 
"Assembly"="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf55d4e60653257a" 
"RuntimeVersion"="v4.0.30319" 
"CodeBase"="file:///S:/Testing/ClassLibrary2/ClassLibrary2/bin/Debug/ClassLibrary2.DLL" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\ProgId] 
@="Test.Comm.1" 

espero que esto ayude :)

+0

Muchas gracias. Las envolturas de la clase COM son manejadas por la plantilla en VS2010, por lo que esa parte es conveniente al menos. También manejé la clave de nombre fuerte en mis compilaciones anteriores, ya que muchos comentarios/artículos mencionaron que se requería. Creo que la distinción es que no sabía ** [ProgId ("Test.Comm.1")] ** sería la etiqueta del ensamblaje que necesitaría invocar. ¡Esto puede ayudarme bastante! Me aseguraré de avisarte si tu gran ayuda se ha solucionado lo antes posible. – lsuarez

+0

No hay problema, ¿cómo funcionó esto para usted? –

+0

Bueno, irónicamente, al mismo tiempo que finalmente resuelvo el problema, el servidor de Win2k se reemplaza por un cuadro de Win 2k8, por lo que ubicaremos un controlador de ASHX en .NET junto con el ASP. Sin embargo, en cuanto a que todo funcione en mi máquina de desarrollo, me ayudaste a solucionarlo. :] – lsuarez

1

Tengo un sitio web ASP clásico que utiliza un objeto COM VB6. Quería crear una nueva versión del objeto COM utilizando .NET en lugar de VB6. Así es como lo hice (espero que esto ayude). Incluyo instrucciones para C# y VB.NET.

[01]

  • de inicio de Visual Studio 2015 (ejecutar como administrador).
  • Cree un nuevo proyecto de "Biblioteca de clases".
  • Nombre es: "DotNetCom"

[02] C#

  • Añadir una nueva clase, el nombre de "HelloCOM".
  • utilizar el siguiente código como molde de partida

(https://msdn.microsoft.com/en-us/library/c3fd4a20.aspx visitar para obtener más información)

using System.Runtime.InteropServices; 

    namespace DotNetCom 
    { 
     [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")] 
     public interface HelloCOMInterface 
     { 
      [DispId(1)] 
      string Hello(); 
     } 

     [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"), 
      InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
     public interface HelloCOMEvents 
     { 
     } 

     [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"), 
      ClassInterface(ClassInterfaceType.None), 
      ComSourceInterfaces(typeof(HelloCOMEvents))] 
     public class HelloCOM : HelloCOMInterface 
     { 
      public string Hello() 
      { 
       return "Hello there!"; 
      } 
     } 
    } 

[02] VB.NET

  • Agregar una nueva "clase COM ", llámalo" HelloCOM ".
  • VB.NET crea la plantilla de inicio.
  • Agregue la siguiente función a la clase "HelloCOM".

    Public Function Hello() As String 
        Return "Hello there!" 
    End Function 
    

[03] C#

  • Abrir las propiedades del proyecto.
  • Ir a "Aplicación".
  • Haga clic en "Información de ensamblaje ...".
  • Verificar "Hacer ensamblaje COM-Visible"
  • Ir a "Crear".
  • Seleccione "Objetivo de la plataforma: x86".
  • Comprobar "Registro de interoperabilidad COM para"

[03] VB.NET

  • abierto "MiProyecto".
  • Ir a "Compilar".
  • Seleccione "CPU de destino: x86".

[04]

  • construir el "DotNetCom.dll".

[05]

  • Abra un símbolo del sistema (ejecutar como administrador).
  • Cambiar el directorio a su dll.

    cd DotNetComTest\DotNetComTest\TX7NGN.COM\bin\Debug 
    
  • Ejecutar RegAsm/codebase.

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm DotNetComTest.dll /codebase "C:\DotNetComTest\DotNetComTest\bin\Debug\DotNetComTest.dll" 
    

[06]

  • Start Servicios de componentes.
  • Agregue una nueva aplicación COM +.
  • Nombrealo: "DotNetCom".
  • Abra las propiedades "DotNetCom".
  • Vaya a la "Pestaña de seguridad".
  • UNCHECK "Aplicar comprobaciones de acceso para esta aplicación".

[07]

  • Añadir un nuevo componente.
  • Seleccione "DotNetComTest.tlb" (NO seleccione "DotNetComTest.dll").

[08]

  • Utilice el objeto COM desde la página ASP clásico.

    <% 
    Dim HelloCOM 
    Set HelloCOM = Server.CreateObject("DotNetCom.HelloCOM") 
    Response.Write HelloCom.Hello 
    %> 
    
Cuestiones relacionadas