2009-11-18 9 views
9

Attualmente ho una libreria di classi .NET scritta in C# che espone la sua funzionalità tramite COM a un programma C++ (pre.NET).Creazione di un server di automazione COM in C#

Ora vogliamo spostare la libreria out-of-process per liberare spazio indirizzo nell'applicazione principale (è un'applicazione di elaborazione delle immagini e le immagini di grandi dimensioni occupano lo spazio degli indirizzi). Ricordo dai miei VB6 giorni che si poteva creare un "server di automazione OLE". Il sistema operativo avvia e arresta automaticamente il server .exe man mano che gli oggetti sono stati creati/distrutti. Questo ci sembra il più adatto per noi: per quanto posso vedere, non cambierebbe nulla nel client, tranne che chiamerebbe CoCreateInstance con CLSCTX_LOCAL_SERVER anziché CLSCTX_INPROC_SERVER.

Come potrei creare un server fuori processo in C#? O non ci sono informazioni online su di esso, o la mia terminologia è off/scaduta!

+0

sono giunto alla conclusione in un punto che non è stato sostenuto, ma mi rifugio' Ho visto quello esplicitamente dichiarato ovunque. Ho provato a passare a CoRegisterClassObject per registrare una factory per un oggetto COM C#, ma non l'ho mai fatto funzionare. Curioso se qualcun altro ha avuto fortuna! –

+0

Controlla la mia risposta qui: http://stackoverflow.com/questions/24724784/com-interop-with-ipc-in-c-sharp/24732010#24732010 –

risposta

6

Si può effettivamente farlo in. NET (l'ho già fatto come prova di concetto), ma è un po 'di lavoro per far funzionare tutto correttamente (durata del processo, registrazione, ecc.).

Creare una nuova applicazione Windows. Nel metodo Main, chiama RegistrationServices.RegisterTypeForComClients- questo è un wrapper gestito attorno a CoRegisterClassObject che si prende cura della classe factory per te. Passa il tipo della classe ComVisible gestita (quella che in realtà vuoi creare-. NET fornisce automaticamente la classe factory) insieme a RegistrationClassContext.LocalServer e RegistrationConnectionType.SingleUse. Ora hai un exe di base che può essere registrato come LocalServer32 per l'attivazione di COM. Dovrai ancora calcolare la durata del processo (implementare i refcounts sugli oggetti gestiti con costruttori/finalizzatori- quando raggiungi lo zero, chiama UnregisterTypeForComClients e esci) - non puoi lasciare che Main esca finché tutti gli oggetti non sono morti.

La registrazione non è male: creare un metodo attributo ComRegisterFunction che aggiunge una chiave LocalServer32 in HKLM \ CLSID (yourclsidhere), il cui valore predefinito è il percorso del proprio exe. Esegui regasm yourexe.exe/codebase/tlb, e sei a posto.

+0

Grazie: scopre che la gestione della durata non era un problema : iniziamo appena il server out-of-process quando l'app principale si avvia e la spegne quando finisce. Quindi l'unico trucco era chiamare RegistrationServices.RegisterTypeForComClients - easy! – Grokys

2

È sempre possibile esporre la classe .NET come classi COM utilizzando InteropServices e quindi configurare la libreria come applicazione COM +. La libreria .NET verrà eseguita out-of-process e verrà ospitata da un'istanza DLLHOST.EXE.

1

Ecco un articolo in MSDN che copre tutti gli aspetti di come creare COM LocalServer in C# (.net): link

Problemi correlati