2010-10-07 20 views
5

Czy ktoś wie, jak pozbyć się AddIns utworzone przy użyciu System.AddIn. Wszystkie przykłady online pokazują, jak z łatwością załadować i używać dodatek, ale żaden nie pokazuje, jak je pozbyć, gdy tylko przeżyją. Moim problemem jest tworzenie dodatków w nowych procesach, a te procesy nigdy nie zbierają śmieci, oczywiście problem.Pozbyć się AddIns utworzone przy użyciu MAF (System.AddIn)

Poniżej znajduje się przykład kodu ilustrujący mój problem. Załóżmy, że użytkownik nigdy nie opuszcza tej aplikacji, ale tworzy wiele instancji ICalculatora. W jaki sposób te procesy addIn są kiedykolwiek usuwane?

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

Och, kilka dodatkowych informacji. Zachowuję także odniesienie do uchwyt umowy w mojej klasie HostViewAdapter, który nadal nie wydaje się zrobić lewy. –

Odpowiedz

9

Udało mi się znaleźć rozwiązanie powyższego problemu, korzystam z klasy AddInController i jej metody zamykania. Teraz, aby zobaczyć, czy mogę dostać to do pracy w mojej aplikacji, a nie tylko ten przykład:

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 za zgłoszenie własnego rozwiązania. Bardzo w duchu SO. – spender

+2

Dzięki, pomyślałem, że mogę uratować moich kolegów deweloperów bólu –

+2

"Myślałem, że mogę uratować moich kolegów twórców bólu" - i jest tyle bólu z System.AddIn .... –

0

rozwiązanie nie działa dla mnie.

Ponieważ podczas tworzenia nowego procesu dla addin można po prostu

addInProcess.Shutdown(); 

zewnętrzna wola proces zamykania