我已经开发了一个excel插件,可以从数据库中获取数据。在某些情况下,excel变得无响应并崩溃。
然后我重新启动excel,该加载项在active 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");
}任何帮助都将不胜感激。
发布于 2017-07-18 21:00:03
在启动时检查数据的可用性可以大大减慢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);
}https://stackoverflow.com/questions/45128038
复制相似问题