我正在尝试使用此问题最流行的答案代码:Using C#, how does one figure out what process locked a file?
我正在使用VS2010和.NET v4在Windows 7 x64中测试此代码。
我发现代码摘录......
var baTemp = new byte[nLength];
try
{
Marshal.Copy(ipTemp, baTemp, 0, nLength);
strObjectName = Marshal.PtrToStringUni(Is64Bits() ? new IntPtr(ipTemp.ToInt64()) : new IntPtr(ipTemp.ToInt32()));
}
catch (AccessViolationException)
{
return null;
}
finally
{
Marshal.FreeHGlobal(ipObjectName);
Win32API.CloseHandle(ipHandle);
}
是造成我问题的原因。当前面创建的地址无效时,Marshal.Copy可能会失败。在x64系统中创建地址的代码......
if (Is64Bits())
{
ipTemp = new IntPtr(Convert.ToInt64(objObjectName.Name.Buffer.ToString(), 10) >> 32);
}
在我记录的失败的一个实例中,缓冲区字符串表示为20588995036390572032,转换为x1C92AA2089E00000。该代码似乎剥离低位字,将x1C92AA20留作可通信地址。
问题1:为什么我们不会简单地使用缓冲区对象提供的64位地址而不是移出低位字并仅使用64位操作系统上运行的64位应用程序中的高位字?
问题2:try / catch / finally块是否应包含的不仅仅是AccessViolationException?
答案 0 :(得分:0)
阅读有关该文章的评论。代码不可行。不行。不要用。即使是“建议的”更正的version也被破坏了(并且它在我的Win8 64位上不起作用)并且用其作者的话来说:
以下是根据Iain Ballard的代码转储生成的。它已损坏:当您检索句柄名称时,它偶尔会锁定。此代码不包含针对该问题的任何解决方法,并且.NET几乎没有选项:Thread.Abort不能再中止当前使用本机方法的线程。