首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel VSTO外接程序在Excel崩溃后一直处于软禁用状态。在excel重新启动时运行addin.Connect = true的任何方法

Excel VSTO外接程序在Excel崩溃后一直处于软禁用状态。在excel重新启动时运行addin.Connect = true的任何方法
EN

Stack Overflow用户
提问于 2017-07-16 19:30:37
回答 1查看 395关注 0票数 0

我已经开发了一个excel插件,可以从数据库中获取数据。在某些情况下,excel变得无响应并崩溃。

然后我重新启动excel,该加载项在active AddIns中列出,但它不显示在功能区中。

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

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

代码语言:javascript
复制
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");
        }

任何帮助都将不胜感激。

EN

Stack Overflow用户

发布于 2017-07-18 21:00:03

在启动时检查数据的可用性可以大大减慢Excel本身的启动时间,此外,外接程序可能会在任何时候丢失连接或获得某些其他异常,这将导致崩溃,因此外接程序将被禁用。

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

试试这个:

代码语言:javascript
复制
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);
}
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45128038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档