2009-11-18 10 views
9

J'ai actuellement une bibliothèque de classe .NET écrite en C# qui expose sa fonctionnalité via COM dans un programme C++ (pre-.NET).Création d'un serveur COM Automation en C#

Nous voulons maintenant déplacer la bibliothèque hors processus pour libérer de l'espace d'adressage dans l'application principale (c'est une application de traitement d'image, et les grandes images mangent de l'espace d'adressage). Je me souviens de mes jours VB6 que l'on pouvait créer un "serveur d'automatisation OLE". Le système d'exploitation démarre et arrête automatiquement le serveur .exe lorsque des objets ont été créés/détruits. Cela semble parfait pour nous: dans la mesure où je peux voir rien ne changerait dans le client, sauf qu'il appellerait CoCreateInstance avec CLSCTX_LOCAL_SERVER au lieu de CLSCTX_INPROC_SERVER.

Comment créer un tel serveur hors processus en C#? Soit il n'y a pas d'information en ligne à ce sujet, soit ma terminologie est éteinte/périmée!

+0

Je suis venu à la conclusion à un moment donné que cela n'a pas été pris en charge, mais je n » t vu que explicitement déclaré nulle part. J'ai essayé d'interférer avec CoRegisterClassObject pour enregistrer une fabrique pour un objet COM C#, mais je n'ai jamais réussi à l'utiliser. Curieux si quelqu'un d'autre a eu de la chance! –

+0

Vérifiez ma réponse ici: http://stackoverflow.com/questions/24724784/com-interop-with-ipc-in-c-sharp/24732010#24732010 –

Répondre

6

Vous pouvez réellement le faire dans .NET (je l'ai déjà fait comme preuve de concept), mais c'est un peu de travail pour que tout fonctionne correctement (durée de vie du processus, enregistrement, etc).

Créez une nouvelle application Windows. Dans la méthode Main, appelez RegistrationServices.RegisterTypeForComClients. Il s'agit d'une enveloppe gérée autour de CoRegisterClassObject qui prend en charge la fabrique de classes pour vous. Passez le Type de la classe ComVisible gérée (celle que vous voulez réellement créer - .NET fournit automatiquement la fabrique de classe) avec RegistrationClassContext.LocalServer et RegistrationConnectionType.SingleUse. Vous disposez maintenant d'un exe très basique qui peut être enregistré en tant que LocalServer32 pour l'activation COM. Vous devrez encore travailler sur la durée de vie du processus (implémenter les recomptes sur les objets gérés avec les constructeurs/finaliseurs - quand vous frappez zéro, appelez UnregisterTypeForComClients et quittez) - vous ne pouvez pas quitter Main jusqu'à ce que tous vos objets soient morts. L'enregistrement n'est pas trop mauvais: créez une méthode attribuée par ComRegisterFunction qui ajoute une clé LocalServer32 sous HKLM \ CLSID (yourclsidhere), dont la valeur par défaut est le chemin d'accès à votre exe. Exécutez regasm yourexe.exe/codebase/tlb, et vous êtes prêt à partir.

+0

Merci: se avère que la gestion de la vie n'a pas été un problème : nous démarrons simplement le serveur hors processus lorsque l'application principale démarre et l'arrêtons à la fin. Donc, le seul truc était d'appeler RegistrationServices.RegisterTypeForComClients - facile! – Grokys

2

Vous pouvez toujours exposer votre classe .NET en tant que classes COM à l'aide d'InteropServices, puis configurer la bibliothèque en tant qu'application COM +. La bibliothèque .NET ne fonctionnerait pas et serait hébergée par une instance de DLLHOST.EXE.

1

Voici un article paru dans MSDN qui couvre tous les aspects de la façon de créer COM localserver dans C# (.net): link