2017-07-16 6 views
0

J'ai développé un addin Excel qui récupère les données de DB. Il existe des scénarios où l'Excel devient non-réactif et se bloque.L'extension Excel VSTO ne cesse de se dégrader après les plantages Excel. N'importe quelle façon d'exécuter addin.Connect = true quand excel redémarre

Ensuite, je redémarre Excel, l'addin est répertorié dans AddIns actif, mais il n'apparaît pas dans le ruban.

Ensuite, je dois aller à Fichier-> Options-> AddIns-> Com AddIns-> Décochez les AddIns vérifiés, puis même chemin encore et Vérifiez l'AddIn à nouveau et il apparaît.

J'ai besoin d'aide pour vérifier quand Excel est redémarré Je devrais vérifier si ajouter connecté (ou visible pour les utilisateurs), si non, connectez-le et montrer. Dans ma tentative morne, j'ai essayé de suivre:

private void ThisAddIn_Startup(object sender, System.EventArgs e) 
    { int i =1; 
     try 
     { 
      foreach (COMAddIn addin in Application.COMAddIns) 
      { 
       if (addin.Description.Contains("ExcelAddInNewTest")) 
       { 
        // addin.Guid.ToString(); 
        addin.Connect = true; 
        MessageBox.Show(addin.Description.ToString()); 
        //if (addin.Connect != true) 
        //{ 
        // addin.Connect = true; 

        //}// addin. 


       } 
      } 
     } 
     catch(Exception ee) 
     { 

      MessageBox.Show("Error in Addin Startup"); 
     } 

Toute aide serait grandement appréciée.

Répondre

1

La vérification de la disponibilité des données au démarrage peut ralentir considérablement le temps de démarrage de l'Excel lui-même et, de plus, le complément peut perdre la connexion ou obtenir une autre exception à tout moment. En conséquence, le complément sera désactivé. Donc, ma solution est plus radicale: J'ai créé un autre petit complément, qui suit les entrées bloquantes dans le registre et les supprime en arrière-plan à chaque démarrage d'Excel. Après le redémarrage d'Excel, tous les compléments bloqués seront renvoyés.

Essayez ceci:

private void ThisAddIn_Startup(object sender, System.EventArgs e) 
{ 
    Action RestoreDisabledAddIns =() => 
    { 
     using (var officeKeys = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Office")) 
     { 
      foreach (var keyName in officeKeys.GetSubKeyNames()) 
      { 
       switch (keyName) 
       { 
        case "14.0": 
        case "15.0": 
        case "16.0":  
         var resiliencyKey = officeKeys.OpenSubKey($"{keyName}\\Excel\\Resiliency\\DisabledItems", RegistryKeyPermissionCheck.ReadWriteSubTree); 
         if (resiliencyKey != null) 
         { 
          var valNames = resiliencyKey.GetValueNames(); 
          foreach (var valName in valNames) 
          { 
           resiliencyKey.DeleteValue(valName); 
          } 
          resiliencyKey.Close(); 
         } 
         break; 
       } 
      } 

      //Enable addins: 
      var addinSubKey = officeKeys.OpenSubKey("Excel\\Addins", RegistryKeyPermissionCheck.ReadWriteSubTree); 
      if (addinSubKey != null) 
      { 
       var addIns = new[] {"YourExcelAddIn1", "YoueExcelAddIn2"}; 
       var subKeys = addinSubKey.GetSubKeyNames(); 
       foreach (var addIn in addIns.Where(t => subKeys.Contains(t))) 
       { 
        var addInKey = addinSubKey.OpenSubKey(addIn, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.SetValue); 
        if (addInKey != null) 
        { 
         addInKey.SetValue("LoadBehavior", 3, RegistryValueKind.DWord); 
         addInKey.Close(); 
        } 
       } 
      } 
      officeKeys.Close(); 
     } 
    }; 
    Task.Factory.StartNew(RestoreDisabledAddIns); 
} 
+0

Merci beaucoup @Stan, cela semble très prometteur. J'essaie cette approche. – user3675870