有没有人知道类似于SafeHandle的实现没有使用我可以从中派生的IntPtr?或者我应该完全创建一个新的句柄?我需要像DangerousGetHandle()和SetHandle()这样的功能,因为我正在使用的整个库都在使用它们。
我问这个问题的原因是,我正在编写一个应用程序,该应用程序使用TAPI2.x的Atapi托管.NET库(可在此处获得:http://atapi.codeplex.com/ )。该应用程序面向32位和64位平台,目前在32位平台上运行良好,但当在64位平台上运行时,它会在库的TapiCall类中抛出错误:
rc = NativeMethods.lineGetCallStatus(_hCall, pLcs);异常详细信息的第一行:
System.ObjectDisposedException was unhandled
Message=Safe handle has been closed
Source=mscorlib
ObjectName=""
StackTrace:
at System.StubHelpers.StubHelpers.SafeHandleC2NHelper(Object pThis, IntPtr pCleanupWorkList)
at JulMar.Atapi.Interop.NativeMethods.lineGetCallStatus(HTCALL hCall, IntPtr lpCallStatus)我回溯了几次调用,并认为问题的根源是对Tapi32.dll中的本机函数的以下调用:
int rc = NativeMethods.lineMakeCall(Line.Handle, out hCall, address, countryCode, lpCp);(在TAPI中定义:http://msdn.microsoft.com/en-us/library/ms735988(VS.85).aspx
64位中的hCall值是“0”,而32位中的值是一个5位数的句柄。其他参数的值看起来没问题,并且在两个平台上都是一样的。
我的猜测是部分问题出在Line.Handle上,它是从SafeHandle派生的,在库中定义如下:
[SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]
internal class HTLINE : SafeHandle
{
internal HTLINE()
: base(IntPtr.Zero, true)
{
}
internal HTLINE(IntPtr preexistingHandle, bool ownsHandle)
: base(preexistingHandle, ownsHandle)
{
}
protected override bool ReleaseHandle()
{
if (handle != IntPtr.Zero)
{
NativeMethods.lineClose(handle);
handle = IntPtr.Zero;
}
return true;
}
public override bool IsInvalid
{
get { return handle == IntPtr.Zero; }
}
}底层的句柄是一个IntPtr,由于它在32位和64位上的大小不同,我认为如果32位上只需要4个字节,这可能会造成问题。为了测试这个理论,我正在考虑创建一个不使用IntPtr的句柄。这听起来像是一种合理的方法吗?
谢谢你的建议。
发布于 2012-07-13 15:49:36
我刚刚在CPU 3.5 (mscorlib是32位)上遇到了同样的问题,在这种情况下,julmar ATAPI必须编译为x86,因为任何.net或x64都不是64位操作系统的选项。
我没有支持64位的dotnet4.0,所以我不能再调试了,我唯一的选择就是x86。
对于信息,TSP需要是64位系统上的64位版本。
发布于 2019-02-06 00:53:41
https://stackoverflow.com/questions/7723896
复制相似问题