Office VSTO AddIn перестает отвечать после вызова Regex несколько раз - PullRequest
0 голосов
/ 27 мая 2019

Я пишу код VSTO C #, который будет копировать содержимое активных проектов в редакторе Visual Basic в любом приложении Office и обрабатывать его в соответствии с некоторыми правилами. AddIn добавляет кнопку на панель инструментов VBE и событие для щелчка.

При отладке работает нормально первые пару раз (между 8 и 12) я нажимаю кнопку, но потом просто перестает реагировать на щелчки. Перезапуск приложения не помогает, но повторная отладка помогает (опять же, для первых 8-12 кликов).

Я экспериментировал с кодом и обнаружил, что он ведет себя так, когда код использует Regex, даже что-то довольно простое. Есть идеи, что может пойти не так?

Этот фрагмент кода только для иллюстрации. Все, что он должен сделать, это создать окно сообщения «ОК» после того, как он применяет Regex к каждому содержимому модуля кода. И это так - в первые 8-12 раз. После этого нажатия кнопки не дают никакого ответа.

Сообщения об ошибках не отображаются, за исключением случаев, когда оно строит решение, среди многих строк, которые оно показывает Выдается исключение: 'System.Deployment.Application.DeploymentException' в System.Deployment.dll , которое не похоже, влияет на программу при первых щелчках.

using Office = Microsoft.Office.Core;
using VBA = Microsoft.Vbe.Interop;
using System.Text.RegularExpressions;

namespace CodeControl
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            AddButton();
        }
        public void AddButton()
        {               
            Office.CommandBar cbr = Globals.ThisAddIn.Application.VBE.CommandBars["Edit"];
            Office.CommandBarButton button = cbr.Controls.Add(Type: 1, Temporary: true).Control;
            button.FaceId = 10;
            button.Visible = true;
            Globals.ThisAddIn.Application.VBE.Events.CommandBarEvents[button].Click += 
                new VBA._dispCommandBarControlEvents_ClickEventHandler(DoWork);
        }
        void DoWork(object CommandBarControl, ref bool handled, ref bool CancelDefault)
        {            
            foreach (VBA.VBComponent component in Globals.ThisAddIn.Application.VBE.ActiveVBProject.VBComponents)
            {
                VBA.CodeModule module = component.CodeModule;
                if (module.CountOfLines < 4)
                    continue;
                string text = module.Lines[1, module.CountOfLines];
                foreach (string lineText in Regex.Split(text, @"(?:\r\n|\n|\r)"))
                   Console.WriteLine(lineText);
                System.Windows.Forms.MessageBox.Show(module.Name);
            }            
        }
        private void ThisAddIn_Shutdown(object sender, System.EventArgs e){}

        #region VSTO generated code

        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }        
        #endregion
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...