2013-03-12 4 views
0

J'ai deux projets .NET, et j'aimerais créer une communication bidirectionnelle entre ceux-ci. ProjectA est un complément partagé qui crée un ruban dans une application MS Office. ProjectB est une application WinForms qui rassemble/envoie des informations depuis/vers un serveur.Référence à une instance existante d'un objet COMVisible

J'ai créé une interface, IAddInCommunication, qui définit les méthodes que je veux appeler à partir ProjectB. Cette interface est dans un projet de bibliothèque de classes distinct. La classe Connect dans ProjectA implémente l'interface IAddInCommunication (avec quelques autres). J'ai également ajouté une référence à la DLL de l'interface dans ProjectB.

Maintenant, je suis en train d'appeler les méthodes du complément partagé, qui est en cours d'exécution dans MS Word, par exemple. Pour ce faire, je suis en utilisant le code suivant (en ProjectB):

const string ProgId="ProjectA.Connect"; 
//... 
Type officeAddInType = Type.GetTypeFromProgID(ProgId);   
object obj = Activator.CreateInstance(officeAddInType); 
_remoteAddIn = (IAddInCommunication)obj; 
_remoteAddIn.TestMethod("Hello"); 

Le problème est que le _remoteAddIn ne pointe pas vers l'instance en cours d'exécution dans Office. C'est juste une nouvelle instance (comme on pourrait s'y attendre). Comment me connecter à l'instance en cours d'exécution du Shared-AddIn?

Je résolus de la communication ProjectA à ProjectB avec l'API SendMessage, parce que je avais besoin que dans ma demande de toute façon. Je ne ferais qu'implémenter la communication SendMessage dans mon Add-In s'il n'y a vraiment pas de meilleure façon.

+1

'(IAddInCommunication) System.Runtime.InteropServices.Marshal.GetActiveObject (ProgId)' est probablement ce que vous recherchez. – vcsjones

+0

@vcsjones Merci, il semble fonctionner. Maintenant, je dois juste résoudre l'exception E_NOINTERFACE. Je vais accepter votre réponse, si vous en faites une réponse réelle. – Marton

Répondre

1

Vous êtes à la recherche probablement:

(IAddInCommunication)System.Runtime.InteropServices.Marshal.GetActiveObject(Pro‌​gId); 

Pour obtenir quelque chose de la table d'objet en cours d'exécution.

Questions connexes