Creazione di una libreria di interoperabilità COM per ASP Classic utilizzando 4.0 framework e Visual Studio 2010

Dopo aver esaminato una serie di articoli diversi e non aver trovato nulla di particolarmente conclusivo che mi accompagni passo passo attraverso il processo, sono venuto in cerca di aiuto.

Lo scenario

Un mio cliente è esperto solo nello sviluppo di ASP Classic . Di recente hanno acquisito un account per un sito originariamente scritto in ASP.NET. Stanno trasformando il sito in qualcosa che possono triggersmente mantenere, ma il sito in origine includeva un gestore di immagini che prendeva dynamicmente i dati relativi ai livelli dell’acqua e genera un’immagine contenente una rappresentazione grafica di tali dati. Il requisito è quello di sviluppare una libreria di interoperabilità COM che possa essere registrata sul server e chiamata con CreateObject per generare lo stesso array di byte dell’immagine per l’output utilizzando Response.BinaryWrite . La libreria di interoperabilità COM deve essere registrata sul sito remoto su un server Windows 2000 e non è ansible formulare alcuna ipotesi sul fatto che abbiano accesso a regasm / gacutil per eseguire tale attività.

La difficoltà

Ho creato la libreria di classi creando un progetto Libreria di classi in Visual Studio 2010, scegliendo “Classe COM” dal modello e inserendo il mio codice per generare una class con un singolo metodo pubblico per restituire un array di byte quando viene fornito un numero intero ( bene, enumeratore, ma tutti uguali). Sfortunatamente, anche sul mio computer di sviluppo dopo aver costruito la libreria e registrato (regasm) e aver memorizzato nella cache l’assembly (gacutil), non posso effettuare una chiamata tramite Classic ASP per creare un’istanza dell’object, ricevendo invece un “componente ActiveX non in grado di creare” object “errore. E, naturalmente, sul sito del server, il file DLL non può essere registrato, la risposta è “Modulo richiesto non trovato”.

Risorse che ho usato

Ho già dato un’occhiata ai seguenti articoli e non ho trovato le risposte di cui ho bisogno:

  1. ( Passaggi di base) Procedura dettagliata: creazione di oggetti COM con Visual Basic
  2. Creare e distribuire un assembly COM .NET
  3. .NET COM + Interop Component con ASP classico

Ciò che di cui ho bisogno

Essenzialmente ciò di cui ho bisogno è un po ‘di mano su una sorta di passo dopo passo di ciò che sarà necessario per soddisfare i requisiti e creare correttamente un modulo di interoperabilità COM + in Visual Studio 2010. La creazione dell’object stesso di class non è terribilmente difficile.

Tuttavia, nessuno degli articoli che ho esaminato discute davvero le opzioni di progetto o le procedure di compilazione con Visual Studio 2010 o .NET 4.0 Framework, né ne ho discusso in alcun modo se ci sono considerazioni speciali per la distribuzione su sistemi meno recenti come Windows Server 2000 e la registrazione effettiva della libreria su un sistema con solo, diciamo, regsvr32 a portata di mano.

Dovrebbe essere abbastanza semplice ottenere un assembly .NET di base esposto a COM – Non ho mai provato il modello di progetto Class COM, quindi questo è il modo in cui l’ho gestito in passato:

Creare una nuova libreria di classi .NET (bog standard) utilizzando C # o VB. Definire un’interfaccia COM (sostituire i GUID con i propri):

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

Ora definisci una class che implementa quell’interfaccia (di nuovo, sostituisci i GUID con i tuoi):

 [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().Select(g => g.Name).ToArray()); } } 

L’attributo Prog ID su questa class è ciò che verrà utilizzato per creare un’istanza del componente da ASP.

Assegna un nome forte all’assembly (Proprietà progetto -> scheda “Firma” -> “Firma l’assemblaggio” -> Crea un nuovo file chiave con nome sicuro utilizzando il menu a discesa)

Ora, costruisci l’assembly e registrati usando Regasm – se non desideri registrarti nel GAC (che raccomando, poiché GACing non semplifica l’implementazione), assicurati di usare il parametro -Codebase (questo aggiunge solo una voce di registro che indica ai clienti dove trovare l’assemblaggio), ad esempio:

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

Ora dovresti essere in grado di creare un’istanza del componente e chiamare i metodi su di esso, ad esempio (in javascript):

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

Per quanto riguarda la distribuzione, l’importante lavoro svolto da Regasm e Regsvr32 è la scrittura di varie impostazioni nel Registro di sistema, in modo che i client possano trovare il componente COM (basato su Prog ID o ID class COM). Tutto quello che devi fare è capire quali sono le impostazioni COM che vengono scritte quando si esegue Regasm sul computer locale e scriverle sul registro sul server. È ansible utilizzare ProcMon per monitorare ciò che viene scritto nel registro quando viene eseguito Regasm.

In generale, puoi aspettarti di vedere qualcosa di simile scritto nel 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" 

Spero che questo ti aiuti 🙂

Ho un sito Web ASP classico che utilizza un object COM VB6. Volevo creare una nuova versione dell’object COM utilizzando .NET anziché VB6. Questo è come l’ho fatto (spero che questo aiuti). Includo le istruzioni per C # e VB.NET.

[01]

  • Avvia Visual Studio 2015 (esegui come amministratore).
  • Creare un nuovo progetto “Libreria di classi”.
  • Chiamalo: “DotNetCom”

[02] C #

  • Aggiungi una nuova class, chiamala “HelloCOM”.
  • Usa il seguente codice come modello di partenza

(visitare https://msdn.microsoft.com/en-us/library/c3fd4a20.aspx per ulteriori informazioni)

  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

  • Aggiungi una nuova “class COM”, chiamala “HelloCOM”.
  • VB.NET crea il modello iniziale.
  • Aggiungi la seguente funzione alla class “HelloCOM”.

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

[03] C #

  • Apri le proprietà del progetto.
  • Vai a “Applicazione”.
  • Fai clic su “Informazioni sull’assemblaggio …”.
  • Seleziona “Rendi l’assemblaggio COM-Visibile”
  • Vai a “Costruisci”.
  • Seleziona “Target piattaforma: x86”.
  • Controlla “Registra COM per Interop”

[03] VB.NET

  • Apri “MyProject”.
  • Vai a “Compila”.
  • Seleziona “CPU di destinazione: x86”.

[04]

  • Creare il “DotNetCom.dll”.

[05]

  • Apri un prompt dei comandi (esegui come amministratore).
  • Cambia directory alla tua DLL.

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

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

[06]

  • Avvia servizi componenti.
  • Aggiungi una nuova applicazione COM +.
  • Chiamalo: “DotNetCom”.
  • Aprire le proprietà “DotNetCom”.
  • Vai alla “Scheda Sicurezza”.
  • UNCHECK “Applica controlli di accesso per questa applicazione”.

[07]

  • Aggiungi un nuovo componente.
  • Selezionare “DotNetComTest.tlb” (NON selezionare “DotNetComTest.dll”).

[08]

  • Utilizzare l’object COM dalla pagina ASP classica.

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