2017-07-16 16 views
0

我开发了一个excel插件,从数据库中提取数据。有些情况下,excel变得无法响应并崩溃。Excel VSTO插件在Excel崩溃后一直保持软禁用状态。任何方式来运行addin.Connect = true时excel重新启动

然后我重新启动excel,插件列在活动的AddIns中,但它不显示在功能区中。

然后,我必须去文件 - >选项 - > AddIns-> Com AddIns->取消勾选选中的AddIns,然后再次相同的路径,并再次检查AddIn,它显示出来。

我需要帮助来检查Excel何时重新启动我应该检查是否添加连接(或对用户可见),如果没有,连接它并显示。在我惨淡的尝试中,我尝试以下:

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"); 
     } 

任何帮助将不胜感激。

回答

1

在启动时检查数据的可用性可能会显着减慢Excel本身的启动时间,此外,此加载项可能会随时丢失连接或发生其他异常,从而导致崩溃和结果加载项将被禁用。

因此,我的解决方案更激进: 我创建了另一个非常小的加载项,用于跟踪注册表中的阻止条目,并在每次Excel启动时在后台删除它们。 Excel重新启动后,将返回所有被阻止的加载项。

试试这个:

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

非常感谢@Stan,这看起来非常有前途。我正在尝试这种方法。 – user3675870