在x64应用程序上使用Convert.ToInt64生成IntPtr失败

时间:2013-08-08 15:44:36

标签: c# 64-bit filehandle intptr

我正在尝试使用此问题最流行的答案代码: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?

1 个答案:

答案 0 :(得分:0)

阅读有关该文章的评论。代码不可行。不行。不要用。即使是“建议的”更正的version也被破坏了(并且它在我的Win8 64位上不起作用)并且用其作者的话来说:

  

以下是根据Iain Ballard的代码转储生成的。它已损坏:当您检索句柄名称时,它偶尔会锁定。此代码不包含针对该问题的任何解决方法,并且.NET几乎没有选项:Thread.Abort不能再中止当前使用本机方法的线程。