.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?)。
我有一个应用程序,它的功能之一是使用 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?)。