9
votes

Création d'un serveur COM Automation en C #

J'ai actuellement une bibliothèque de classe .NET écrite en C # qui expose sa fonctionnalité via COM à un programme C ++ (pré -.net).

Nous voulons maintenant déplacer la bibliothèque hors processus pour libérer l'espace d'adressage dans l'application principale (une application de traitement d'image et des images de grandes images consomment de l'espace d'adresses). Je me souviens de mes jours de VB6 que l'on pourrait créer un "serveur d'automatisation OLE". Le système d'exploitation démarrerait et arrêterait automatiquement le serveur .exe comme des objets ont été créés / détruits. Cela ressemble à l'ajustement parfait pour nous: autant que je ne puisse voir que rien ne changerait dans le client, sauf que cela appellerait CoCreateInstance avec CLSCTX_LOCAL_SERVER au lieu de CLSCTX_INPROC_SERVER.

Comment créerais-je un tel serveur hors de processus en C #? Soit il n'y a aucune information en ligne à ce sujet, soit ma terminologie est désactivée / hors de date!


2 commentaires

Je suis arrivé à la conclusion à un moment donné que cela n'était pas soutenu, mais je n'ai pas vu cela explicitement déclaré nulle part. J'ai essayé de s'interoppner à CoregisterClassObject pour enregistrer une usine pour un objet COM c #, mais je n'ai jamais eu de travailler. Curieux si quelqu'un d'autre a eu de la chance!


Consultez ma réponse ici: Stackoverflow.com/questions/24724784/...


4 Réponses :


2
votes

Vous pouvez toujours exposer votre classe .NET en tant que classes COM à l'aide d'Interopservices, puis configurez la bibliothèque comme application COM +. La bibliothèque .NET fonctionnerait hors du processus et être hébergée par une instance DLLHOST.EXE.


0 commentaires

6
votes

Vous pouvez réellement faire cela dans .NET (je l'ai déjà fait auparavant comme une épreuve de concept), mais c'est un peu de travail pour que tout fonctionne à droite (cours de vie, enregistrement, etc.).

Créer une nouvelle application Windows. Dans la méthode principale, appelez les registres d'enregistrementservices.registertypeforccliques - Il s'agit d'une enveloppe gérée autour de CoreGisterClassObject qui prend soin de l'usine de classe pour vous. Passez-le le type de la classe comisible gérée (celui que vous souhaitez réellement créer - .NET fournit automatiquement l'usine de classe) avec enregistrementClassContext.LocalServer et enregistrementConnectionType.SingleUse. Maintenant, vous avez un exe très basique qui peut être enregistré en tant que LocalServer32 pour l'activation COM. Vous devrez toujours travailler sur la durée de vie du processus (mettre en œuvre refcounts sur les objets gérés avec constructeurs / finaliseurs, lorsque vous avez frappé zéro, appelez UNREGISTRYPEFORCCLIGNIENTS et sortie) - vous ne pouvez pas laisser la sortie principale tant que tous vos objets sont morts.

L'enregistrement n'est pas trop mauvais: Créez une méthode compregisterisisterShecunction attribuée qui ajoute une clé LOCALLERVER32 sous HKLM \ CLSID (YourClSIDHERE), dont la valeur par défaut est le chemin de votre EXE. Exécutez Regasm Yecurexe.exe / CodeBase / TLB, et vous êtes prêt à partir.


1 commentaires

Merci: Souvent que la gestion de la vie n'était pas un problème: nous venons de démarrer le serveur hors processus lorsque l'application principale commence et la fermise quand elle se termine. Donc, la seule astuce était d'appeler les registresservices.registertypeforccliques - Facile!



1
votes

Voici un article de MSDN qui couvre tous les aspects de la manière de créer COM LocalServer en C # (.NET): Link


0 commentaires

0
votes

Votre message a commencé il y a quelque temps et j'ai eu le même problème. Le lien suivant est or absolu et vous dit tout

http://www.andymcm.com/blog /2009/10/managed-dcom-server.html


0 commentaires