2010-10-07 42 views
5

Est-ce que quelqu'un sait comment disposer des AddIn créés avec System.AddIn? Tous les exemples en ligne semblent montrer comment charger et utiliser facilement un addin, mais aucun ne montre comment les éliminer une fois qu'ils sont vivants. Mon problème est que je crée des addins dans de nouveaux processus, et que ces processus ne sont jamais récupérés, ce qui est un problème.Élimination des AddIn créés avec MAF (System.AddIn)

Voici un exemple de code illustrant mon problème. Supposons que l'utilisateur ne quitte jamais cette application, mais crée à la place de nombreuses instances de ICalculator. Comment ces processus addIn sont-ils éliminés?

static void Main(string[] args) 
    { 
     string addInRoot = GetExecutingDirectory(); 

     // Update the cache files of the pipeline segments and add-ins 
     string[] warnings = AddInStore.Update(addInRoot); 

     // search for add-ins of type ICalculator 
     Collection<AddInToken> tokens = AddInStore.FindAddIns(typeof(ICalculatorHost), addInRoot); 

     string line = Console.ReadLine(); 
     while (true) 
     { 
      AddInToken calcToken = ChooseCalculator(tokens); 

      AddInProcess addInProcess = new AddInProcess(); 
      ICalculatorHost calc = calcToken.Activate<ICalculatorHost>(addInProcess, AddInSecurityLevel.Internet); 

      // run the add-in 
      RunCalculator(calc);  
     } 
    } 
+0

Oh, quelques informations supplémentaires. Je garde également une référence à la poignée de contrat dans ma classe HostViewAdapter, qui ne semble toujours pas faire l'affaire. –

Répondre

9

j'ai réussi à trouver une solution au problème ci-dessus, il est fait usage de la classe AddInController et sa méthode d'arrêt. Maintenant, pour voir si je peux obtenir ce travail dans ma demande, non seulement cet exemple:

static void Main(string[] args) 
    { 
     string addInRoot = GetExecutingDirectory(); 
     string[] warnings = AddInStore.Update(addInRoot); 
     Collection<AddInToken> tokens = AddInStore.FindAddIns(typeof(ICalculatorHost), addInRoot); 


     while (true) 
     { 
      AddInToken calcToken = ChooseCalculator(tokens); 

      AddInProcess addInProcess = new AddInProcess(); 
      ICalculatorHost calc = calcToken.Activate<ICalculatorHost>(addInProcess, AddInSecurityLevel.Internet); 

      // run the add-in 
      RunCalculator(calc); 

      // shutdown the add-in when the RunCalculator method finishes executing 
      AddInController controller = AddInController.GetAddInController(calc); 
      controller.Shutdown(); 
     } 
    } 
+2

+1 pour avoir signalé votre propre solution. Très dans l'esprit de SO. – spender

+2

Merci, je pensais que je sauverais mes collègues développeurs de la douleur –

+2

"Je pensais que je sauverais mes collègues développeurs de la douleur" - et il y a tellement de douleur avec System.AddIn .... –

0

votre solution ne fonctionne pas pour moi.

Puisque vous créez un nouveau processus pour votre Addin vous pouvez simplement

addInProcess.Shutdown(); 

le processus externe arrêt