2010-10-07 22 views
5

¿Alguien sabe cómo deshacerse de las adiciones creadas con System.AddIn? Todos los ejemplos en línea parecen mostrar cómo cargar y usar fácilmente un complemento, pero ninguno muestra cómo deshacerse de ellos una vez que están vivos. Mi problema es crear complementos en nuevos procesos, y estos procesos nunca se recogen basura, obviamente, es un problema.Eliminar las adiciones creadas con MAF (System.AddIn)

A continuación se muestra un ejemplo de código que ilustra mi problema. Supongamos que el usuario nunca sale de esta aplicación, sino que crea muchas instancias de ICalculator. ¿Cómo se eliminan estos procesos addIn?

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, alguna información adicional. También estoy manteniendo una referencia al manejador del contrato en mi clase HostViewAdapter, que todavía no parece ser el truco. –

Respuesta

9

he conseguido encontrar una solución al problema anterior, se trata de hacer uso de la clase AddInController y es el método de apagado. Ahora a ver si puedo conseguir que esto funcione en mi aplicación, no sólo este ejemplo:

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 para informar su propia solución. Muy en espíritu de SO. – spender

+2

Gracias, pensé que iba a salvar a mis compañeros desarrolladores el dolor –

+2

"Pensé que iba a salvar a mis compañeros desarrolladores el dolor" - y hay mucho dolor con System.AddIn .... –

0

su solución no funcionó para mí.

Puesto que usted está creando un nuevo proceso para su complemento puede simplemente

addInProcess.Shutdown(); 

el proceso de apagado voluntad externa

Cuestiones relacionadas