Cómo: Activar complementos con niveles de seguridad y aislamiento diferentes

Actualización: noviembre 2007

Puede activar un complemento utilizando distintas configuraciones del dominio de aplicación y el proceso que se adapten a los requisitos de aislamiento y seguridad. Las sobrecargas del método Activate de la clase AddInToken proporcionan las siguientes opciones para activar un complemento:

  • En su propio dominio de aplicación, que el sistema genera automáticamente.

  • En un dominio de aplicación existente, con o sin otros complementos.

  • En el mismo entorno (dominio de aplicación y proceso) que otro complemento.

  • En un nuevo proceso externo que sea independiente del proceso del host. El nuevo proceso puede incluir otros complementos que compartan ese mismo proceso.

Al activar un complemento en un nuevo dominio de aplicación o proceso, debe especificar un nivel de seguridad con un objeto AddInSecurityLevel o PermissionSet. Para obtener más información acerca de cómo se activan los complementos, vea Activación de complementos.

En los procedimientos siguientes se muestra cómo se implementan estas opciones de activación utilizando las sobrecargas del método Activate. En el ejemplo se presupone que se han generado las cachés del segmento de canalización y el complemento y que se han encontrado y devuelto uno o varios complementos de una colección AddInToken denominada tokens. Para obtener más información acerca de cómo se generan los archivos de la memoria caché y cómo se buscan complementos, vea Detección de complementos.

Para activar un complemento en un nuevo dominio de aplicación

  • Utilice la sobrecarga del método Activate<T>(AddInSecurityLevel) o Activate<T>(PermissionSet).

    'Ask the user which add-in they would like to use.
    Dim selectedToken As AddInToken = ChooseAddIn(tokens)
    'Activate the selected AddInToken in a new
    'application domain with the Internet trust level.
    Dim CalcAddIn As Calculator = selectedToken.Activate(Of Calculator)(AddInSecurityLevel.Internet)
    'Run the add-in using a custom method.
    RunCalculator(CalcAddIn)
    
    //Ask the user which add-in they would like to use.
    AddInToken selectedToken = ChooseAddIn(tokens);
    
    //Activate the selected AddInToken in a new
    //application domain with the Internet trust level.
    Calculator CalcAddIn = selectedToken.Activate<Calculator>(AddInSecurityLevel.Internet);
    
    //Run the add-in using a custom method.
    RunCalculator(CalcAddIn);
    

Para activar un complemento en el mismo dominio de aplicación que otro complemento

  • Utilice la sobrecarga del método Activate<T>(AppDomain).

    ' Get the application domain
    ' of an existing add-in (CalcAddIn).
    
    Dim aiCtrl As AddInController = AddInController.GetAddInController(CalcAddIn)
    Dim AddInAppDom As AppDomain = aiCtrl.AppDomain
    
    ' Activate another add-in in the same appliation domain.
    Dim CalcAddIn3 As Calculator = selectedToken2.Activate(Of Calculator)(AddInAppDom)
    
    ' Show that the CalcAddIn3 was loaded
    ' into CalcCaddIn's application domain.
    Dim aic As AddInController = AddInController.GetAddInController(CalcAddIn3)
    Console.WriteLine("Add-in loaded into existing application domain: {0}", _
     aic.AppDomain.Equals(AddInAppDom))
    
    // Get the application domain
    // of an existing add-in (CalcAddIn).
    AddInController aiCtrl = AddInController.GetAddInController(CalcAddIn);
    AppDomain AddInAppDom = aiCtrl.AppDomain;
    
    // Activate another add-in in the same application domain.
    Calculator CalcAddIn3 =
        selectedToken2.Activate<Calculator>(AddInAppDom);
    
    // Show that CalcAddIn3 was loaded
    // into CalcAddIn's application domain.
    AddInController aic = AddInController.GetAddInController(CalcAddIn3);
    Console.WriteLine("Add-in loaded into existing application domain: {0}",
        aic.AppDomain.Equals(AddInAppDom));
    

Para activar un complemento en el mismo dominio de aplicación y el mismo proceso que otro complemento

  • Utilice la sobrecarga del método Activate<T>(AddInEnvironment).

    ' Get the AddInController of a 
    ' currently activated add-in (CalcAddIn).
    Dim aiController As AddInController = AddInController.GetAddInController(CalcAddIn)
    
    ' Select another token.
    Dim selectedToken2 As AddInToken = ChooseAddIn(tokens)
    
    ' Activate a second add-in, CalcAddIn2, in the same
    ' appliation domain and process as the first add-in by passing
    ' the first add-in's AddInEnvironment object to the Activate method.
    
    Dim aiEnvironment As AddInEnvironment = aiController.AddInEnvironment
    Dim CalcAddIn2 As Calculator = _
        selectedToken2.Activate(Of Calculator)(aiEnvironment)
    
    ' Get the AddInController for the second add-in to compare environments.
    Dim aiController2 As AddInController = AddInController.GetAddInController(CalcAddIn2)
    
    Console.WriteLine("Add-ins in same application domain: {0}", _
        aiController.AppDomain.Equals(aiController2.AppDomain))
    Console.WriteLine("Add-ins in same process: {0}", _
        aiEnvironment.Process.Equals(aiController2.AddInEnvironment.Process))
    
    // Get the AddInController of a 
    // currently actived add-in (CalcAddIn).
    AddInController aiController = AddInController.GetAddInController(CalcAddIn);
    
    // Select another token.
    AddInToken selectedToken2 = ChooseAddIn(tokens);
    
    // Activate a second add-in, CalcAddIn2, in the same
    // appliation domain and process as the first add-in by passing
    // the first add-in's AddInEnvironment object to the Activate method.
    AddInEnvironment aiEnvironment = aiController.AddInEnvironment;
    Calculator CalcAddIn2 =
        selectedToken2.Activate<Calculator>(aiEnvironment);
    
    // Get the AddInController for the second add-in to compare environments.
    AddInController aiController2 = AddInController.GetAddInController(CalcAddIn2);
    Console.WriteLine("Add-ins in same application domain: {0}", aiController.AppDomain.Equals(aiController2.AppDomain));
    Console.WriteLine("Add-ins in same process: {0}", aiEnvironment.Process.Equals(aiController2.AddInEnvironment.Process));
    

Para activar un complemento en un nuevo proceso

  • Utilice la sobrecarga del método Activate<T>(AddInProcess, AddInSecurityLevel) o Activate<T>(AddInProcess, PermissionSet).

    ' Create an external process.
    Dim pExternal As New AddInProcess()
    
    ' Activate an add-in in the external process
    ' with a full trust security level.
    Dim CalcAddIn4 As Calculator = _
        selectedToken.Activate(Of Calculator)(pExternal, _
            AddInSecurityLevel.FullTrust)
    
    ' Show that the add-in is an an external process
    ' by verifying that it is not in the current (host's) process.
    Dim AddinCtl As AddInController = AddInController.GetAddInController(CalcAddIn4)
    Console.WriteLine("Add-in in host's process: {0}", _
     AddinCtl.AddInEnvironment.Process.IsCurrentProcess)
    
    // Create an external process.
    AddInProcess pExternal = new AddInProcess();
    
    // Activate an add-in in the external process
    // with a full trust security level.
    Calculator CalcAddIn4 =
        selectedToken.Activate<Calculator>(pExternal,
        AddInSecurityLevel.FullTrust);
    
    // Show that the add-in is an an external process
    // by verifying that it is not in the current (host's) process.
    AddInController AddinCtl = AddInController.GetAddInController(CalcAddIn4);
    Console.WriteLine("Add-in in host's process: {0}",
        AddinCtl.AddInEnvironment.Process.IsCurrentProcess);
    

Vea también

Conceptos

Detección de complementos

Experiencia de programadores de complementos

Otros recursos

Complementos y extensibilidad