5

Dopo aver esaminato un numero 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 .Creazione di una libreria di interoperabilità COM per ASP Classic utilizzando 4.0 framework e Visual Studio 2010

Lo scenario

Un mio cliente è abile solo nello sviluppo per ASP Classic. Di recente hanno acquisito un account per un sito originariamente scritto in ASP.NET. Stanno trasformando il sito in qualcosa che possono attivamente mantenere, ma il sito in origine includeva un gestore di immagini che prendeva dinamicamente i dati relativi ai livelli dell'acqua e genera un'immagine contenente una rappresentazione grafica di tali dati. L'esigenza è 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 usando Response.BinaryWrite. La libreria di interoperabilità COM deve essere registrata sul sito remoto su un server Windows 2000 e non è possibile formulare alcuna ipotesi sul fatto che abbiano accesso a regasm/gacutil per eseguire tale attività.

la difficoltà

Ho costruito la libreria di classi per la creazione di un progetto dilibreria di classi in Visual Studio 2010, scegliendo "COM Class" dal modello, e inserendo il mio codice per generare una classe con un singolo metodo pubblico per restituire un array di byte quando viene fornito un intero (beh, enumeratore, ma tutti uguali). Sfortunatamente, anche sul mio computer di sviluppo dopo aver costruito la libreria e registrato (regasm) e messo in cache l'assembly (gacutil), non posso effettuare una chiamata tramite Classic ASP per creare un'istanza dell'oggetto, ricevendo invece un "ActiveX componente non può creare oggetto "errore. E, naturalmente, sul sito del server, il file DLL non può essere registrato, la risposta è "Modulo richiesto non trovato".

Risorse Ho usato

Ho già dato un'occhiata attraverso i seguenti articoli e non hanno alzato le risposte di cui ho bisogno:

  1. (passi di base) Walkthrough: Creating COM Objects with Visual Basic
  2. Build and Deploy a .NET COM Assembly
  3. .NET COM+ Interop Component with Classic ASP

Quello che ho bisogno

Essenzialmente quello che mi serve è un po 'di tenersi per mano su una specie di passo per passo di quello che sta andando a prendere per soddisfare le esigenze e creare correttamente un modulo COM+ interoperabilità in Visual Studio 2010. La creazione dell'oggetto stesso di classe non è molto 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é nessuno di loro ha discusso seriamente se ci sono considerazioni particolari per la distribuzione su sistemi meno recenti come Windows Server 2000 e la registrazione effettiva della libreria su un sistema con solo, per esempio, regsvr32 a portata di mano.

+0

Per tutti coloro che vengono dietro: Su facendo un po 'di più compiti a casa, ho voluto notare qui che ho anche bisogno di indirizzare la mia libreria al NET Framework 2.0 come quello è l'ultimo quadro supportato da Windows Server 2000. – lsuarez

risposta

11

Dovrebbe essere abbastanza semplice ottenere una base.Assemblato NET esposto a COM - Non ho mai provato il modello di progetto Classe COM, quindi è 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 GUID con il proprio):

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

Ora definire una classe che implementa l'interfaccia (di nuovo, sostituire GUID con il proprio):

[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()); 
    } 
} 

L'attributo Prog ID su questo class è ciò che userai per istanziare il tuo componente da ASP.

Fortemente-denominare il gruppo (Proprietà del progetto -> scheda "Firma" -> "Firmare l'assembly" -> Creare un nuovo file di chiave con nome utilizzando il menu a discesa)

Ora, costruire l'assemblaggio, e registrare utilizzando Regasm - se non si desidera effettuare la registrazione nel GAC (che raccomando, poiché GACing non semplifica l'implementazione), assicurarsi di utilizzare il parametro -Codebase (ciò aggiunge semplicemente una voce reg che indica ai client dove trovare il montaggio) - ad esempio:

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

Ora si dovrebbe essere in grado di creare un'istanza del componente, e chiamare i metodi su di esso - per esempio (i n javascript):

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

Quando si tratta di distribuzione, l'importante lavoro che Regasm e Regsvr32 fanno è quello di scrivere le varie impostazioni nel Registro di sistema, in modo che i clienti possono trovare il componente COM (basata su Prog ID, o COM ID della classe). 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. È possibile utilizzare ProcMon per monitorare ciò che viene scritto nel registro quando viene eseguito Regasm.

In generale, si può aspettare di vedere qualcosa di simile scritta al Registro di sistema:

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

+0

Grazie mille. I wrapper di classe COM vengono gestiti dal modello in VS2010, in modo tale che la parte sia conveniente almeno. Ho gestito la chiave del nome forte anche nelle mie build passate dal momento che molti commenti/articoli menzionavano che era necessario. Penso che la distinzione sia che non sapevo ** [ProgId ("Test.Comm.1")] ** sarebbe l'etichetta sull'assieme che avrei dovuto invocare. Questo potrebbe aiutarmi un bel po '! Sarò certo di farti sapere se il tuo aiuto molto approfondito è stato eliminato al più presto. – lsuarez

+0

Nessun problema: come ha funzionato questo per te? –

+0

Bene, ironicamente, allo stesso tempo, ottengo finalmente una certa risoluzione al problema, il server Win2k è sostituito da una casella Win 2k8, quindi posizioneremo un gestore ASHX in .NET con l'ASP. Tuttavia, per quanto riguarda il funzionamento delle cose sul mio computer di sviluppo, mi hai aiutato a risolverlo. :] – lsuarez

1

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

[01]

  • Avviare Visual Studio 2015 (eseguito come amministratore).
  • Creare un nuovo progetto "Libreria di classi".
  • Nome è: "DotNetCom"

[02] C#

  • Aggiungere una nuova classe, il nome "HelloCOM".
  • utilizzare il seguente codice come punto di partenza del modello

(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 "classe COM ", chiamalo" HelloCOM ".
  • VB.NET crea il modello iniziale.
  • Aggiungere la seguente funzione alla classe "HelloCOM".

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

[03] C#

  • Aprire le proprietà del progetto.
  • Passare a "Applicazione".
  • Fare clic su "Informazioni sull'assieme ...".
  • Controllare "Make assembly COM-Visible"
  • Passare a "Build".
  • Selezionare "Target piattaforma: x86".
  • Check "Registra per interoperabilità"

[03] VB.NET

  • Open "MyProject".
  • Vai a "Compila".
  • Selezionare "CPU di destinazione: x86".

[04]

  • costruire la "DotNetCom.dll".

[05]

  • Aprire un prompt dei comandi (eseguire come amministratore).
  • Cambia directory per la tua DLL.

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

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

[06]

  • Avviare Servizi componenti.
  • Aggiungere una nuova applicazione COM +.
  • Nome: "DotNetCom".
  • Aprire le proprietà "DotNetCom".
  • Passare 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'oggetto COM dalla pagina Classic ASP.

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