2017-07-16 15 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