2009-12-10 13 views
0

Je voudrais savoir comment on peut ajouter un objet .NET C# COM (créé en utilisant la fonction COM Interop de .NET) à un serveur Visual Studio 2008 ATL EXE. Fondamentalement, j'essaye de créer un serveur d'automation hors de processus pour tenir mon objet C# COM pour lui permettre d'agir en tant que serveur de Singleton pour beaucoup de clients. Je pense que tout ce que je dois faire est d'ajouter les entrées appropriées au fichier IDL du serveur ATL EXE? Est-ce que ça sonne bien? Quelqu'un aurait-il aussi une idée de comment instancier mon objet C# COM? Je devine que j'ai besoin de redéfinir son GUID sinon cela ne ferait qu'instancier le C# tout de suite? Merci pour toute aide.HOWTO ajouter agrégat .NET COM Interop à un serveur ATL EXE?

-David

Par exemple: .

import "oaidl.idl"; 
import "ocidl.idl"; 

[ 
uuid(A9F9E81F-D5FE-4718-8078-E8378CFB3D3C), 
version(1.0), 
helpstring("Libreria dei tipi SSOLoginDLLServer 1.0") 
] 
library SSOLoginDLLServerLib 
{ 
importlib("stdole2.tlb"); 
import "SSOLoginDLL.tlb"; <-- Reference included to my C# project which creates the TLB 
[ 
    uuid(A8FD5BC5-3B8D-4828-B9CB-6496A7A6D9B9) 
] 
coclass CSSOLogin 
{ 
    [default] interface ISSOLogin; 
    [default, source] dispinterface ISSOLoginEvents; 
}; 
}; 
+0

Il semble que vous avez sorte de pêle-mêle trois questions vers le haut. .. (1) comment créer un serveur COM dans ATL; (2) comment faire de ce serveur une instance unique et/ou des instances partagent une ressource singleton; (3) à partir de ce serveur (ou ressource) comment instancier et utiliser un autre objet COM (qui est implémenté dans .NET). Pourriez-vous préciser lequel de ces vous êtes collé? – Eric

+0

Les deux autres que je peux vérifier/tester une fois que j'ai la réponse à votre # 3 :), alors je dirais comment laisser le serveur COM ATL EXE fournir au monde extérieur un autre objet COM déjà écrit. Merci. – David

Répondre

0

Vous avez donc un objet COM (votre serveur ATL), qui existe dans le seul but de donner aux clients l'accès à un autre objet COM (l'objet C#). Il est important de noter que vous ne parlez pas de donner aux clients l'accès au TYPE (c'est-à-dire qu'ils vont instancier leur propre instance de l'objet C#) mais plutôt à l'INSTANCE réelle. Votre serveur ATL doit donc définir et implémenter une interface fournissant l'accès nécessaire. Soit vous pouvez simplement retourner l'objet C#:

MyInterface 
{ 
    IUnkown GetThatComObject(); 
} 

auquel cas le client devra également connaître toutes les définitions de type de la bibliothèque C#, afin qu'ils puissent travailler avec cet objet une fois qu'ils l'obtiennent.

ou vous pouvez l'envelopper, de sorte que les clients ne doivent connaître votre bibliothèque de type primaire:

MyInterface 
{ 
    bool TellThatComObjectFoo(); 
    int TellThatComObjectBar(); 
    // etc. 
} 

De toute façon, je pense que c'est ce que vous voulez dire quand vous demandez « [aurais-je] besoin pour redéfinir son GUID '- oui, les types (et leurs GUID) définis par votre serveur ATL doivent être indépendants des autres classes qu'ils utilisent.

(BTW, désolé je ne donne pas de vous corriger IDL ou quoi que ce soit ici ... Je n'ai pas vraiment créé un objet COM depuis 1999.)