我有一个自定义Windows服务,安装在大约500个生产系统上,收集有关机器的信息(硬盘大小/自由空间,安装了RAID控制器等)上周我发现其中一台服务器没有' t报告,所以我登录到机器,我注意到该服务确实抛出异常。
问题出现了:异常都是System.AccessViolationException类型,但我不确定为什么我会突然看到它们。它们发生在两个不同的地方:一次是我调用SqlServerCe程序集(非托管)的地方,另一个地方是我尝试释放NetApi32.dll中的缓冲区(该代码如下)
private static string GetNetworkName()
{
int result = 0;
string network = null;
IntPtr pDomain = IntPtr.Zero;
NetJoinStatus status = NetJoinStatus.NetSetupUnknownStatus;
try
{
result = NetGetJoinInformation(null, out pDomain, out status);
if (result == ErrorSuccess && status == NetJoinStatus.NetSetupDomainName)
{
network = Marshal.PtrToStringAuto(pDomain);
}
else if (result == ErrorSuccess && status == NetJoinStatus.NetSetupWorkgroupName)
{
network = Marshal.PtrToStringAuto(pDomain);
}
}
finally
{
if (pDomain != IntPtr.Zero) NetApiBufferFree(pDomain);
}
if (network == null) network = "";
return network;
}
在finally块中抛出异常。我对如何解决这个问题感到茫然;我没有在任何其他服务器上看到这个问题,几年内没有对服务本身进行更新等等。在服务失败之前,机器上发生的最后一件事是与Crypt32和ASP相关的Windows更新。 NET已下载并安装,但我不认为这与手头的问题有关。
我是否可以采取任何步骤来弄清楚为什么会出现这个问题?我知道AccessViolationException通常意味着非托管代码试图在内存中寻址无效地址,但无论如何,我是否要解决为什么会发生这种情况并纠正它?