.Net 事件未在 Visual Studio 调试器之外触发

.Net Events not firing outside of Visual Studio debugger

我有一个应用程序,它的功能之一是使用 WMI 检查防病毒软件是否 运行ning。

class AntiVirus
    {
        public delegate void AVStatusHandler(bool running);
        public event AVStatusHandler AVStatus;
        public delegate void AVStatusErrorHandler(string Error);
        public event AVStatusErrorHandler AVStatusError;
        public delegate void AVLogHandler(string Message);
        public event AVLogHandler AVLog;

        internal void GetAVStatus()
        {
            if (AVLog != null) AVLog("Getting AV Status");
            try
            {
                ManagementObjectSearcher searcher =
                    new ManagementObjectSearcher("root\Microsoft\protectionManagement",
                    "SELECT * FROM MSFT_MpComputerStatus");

                foreach (ManagementObject queryObj in searcher.Get())
                {
                    if (AVStatus != null)
                    {
                      //  AVStatus("Anti-Spyware Enabled", (bool)queryObj["AntispywareEnabled"]);
                        AVStatus((bool)queryObj["AntivirusEnabled"]);
                     //   AVStatus("Behavior Monitor Enabled", (bool)queryObj["BehaviorMonitorEnabled"]);
                     //   AVStatus("Ioav Protection Enabled", (bool)queryObj["IoavProtectionEnabled"]);
                     //   AVStatus("NIS Enabled", (bool)queryObj["NISEnabled"]);
                     //   AVStatus("Real Time Protection Enabled", (bool)queryObj["RealTimeProtectionEnabled"]);
                    }
                }
                if (AVLog != null) AVLog("Getting AV Status - Completed");
            }
            catch (ManagementException e)
            {
                if (AVLog != null) AVLog("Getting AV Status - Failed");
                if (AVStatusError != null)
                    AVStatusError("An error occurred while querying for WMI data: " + e.Message);
            }
        }
    }

它在调用主窗体 (frmMain) 中引发 AVStatus 事件

 private void GetAvDetails()
        {
            av.AVStatus += av_AVStatus;
            av.GetAVStatus();           
        }

        void av_AVStatus(bool running)
        {
            SetRichTextBoxText(rtbConOut, "Av Status = " + running.ToString());
            Properties.Settings.Default.AntiVirusEnabled = running;
        }

消息显示如下: Properties.Settings.Default.AntiVirusEnabled 设置为 running.

的布尔值

当鼠标移动到应用程序的顶部时,会显示 window 显示各种设置;其中 Properties.Settings.Default.AntiVirusEnabled 值分配给 Checkbox.Checked 属性。因此,如果 AV 是 运行,则检查 Checkbox

在 VS2013 中一切正常。但是,当我将其发布为 ClickOnce 应用程序并在虚拟机 (Hyper-V) 上 运行 时,该程序不会引发 AVStatus 事件或更新 Checkbox ,如图所示这里:

防病毒软件 运行正在两台虚拟机上运行。

所以问题是:

为什么代码在 Visual Studio 内的虚拟机上可以正常工作,但在没有 Visual Studio 的虚拟机上却不能?

开发 VM = Win 8.1 Enterprise x64 测试虚拟机 = Win 8.1 Professional x64 Visual Studio 2013 终极版。

事件 AVStatus 只有在至少找到一个 ManagementObject 时才会触发。我想这是一个正确的问题。尝试扩展您的日志记录并记录找到的 ManagementObject 的数量,例如(服务器上未使用 AVLog?)。