Excel VSTO在Excel崩溃后继续添加软禁用。 当excel重新启动时,任何运行addin.Connect = true的方法

我开发了一个从数据库中提取数据的excel插件。 有一些情况下,Excel变得无响应和崩溃。

然后,我重新启动Excel,外挂程序列在活动的AddIns中,但不显示在function区中。

然后我必须去文件 – >选项 – > AddIns-> Com AddIns->取消勾选选中的AddIns,然后再次相同的path,并再次检查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"); } 

任何帮助将不胜感激。

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

所以,我的解决scheme更为激进:我创build了另一个非常小的加载项,用于跟踪registry中的阻止项,并在每次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); }