C# 调用AddRofPindedObject解决算术溢出
我正在使用lib预览和捕获捕获卡中的快照 图书馆: 它是为.NET2.0构建的,当从.NET2.0或3.5项目调用这些类和控件时,一切都可以完美地工作 当我从一个.NET4.0项目中添加对它的引用时,我得到了一个奇妙的例外C# 调用AddRofPindedObject解决算术溢出,c#,.net,C#,.net,我正在使用lib预览和捕获捕获卡中的快照 图书馆: 它是为.NET2.0构建的,当从.NET2.0或3.5项目调用这些类和控件时,一切都可以完美地工作 当我从一个.NET4.0项目中添加对它的引用时,我得到了一个奇妙的例外 Arithmetic operation resulted in an overflow. 当试图: GCHandle handle = GCHandle.Alloc(this.savedArray, GCHandleType.Pinned); int scan0 = (i
Arithmetic operation resulted in an overflow.
当试图:
GCHandle handle = GCHandle.Alloc(this.savedArray, GCHandleType.Pinned);
int scan0 = (int)handle.AddrOfPinnedObject();
我很乐意将我的应用程序更改为.NET2.0,但我需要它位于.NET4.0中,以引用其他LIB
我不知道怎么解决这个问题。我曾尝试在.NET4.0中编译这些LIB,并获得了成功,但在执行这段代码时,出现了同样的问题。这可能是.NET4.0中的问题吗
我迷路了。如果您能在这方面提供一些指导,那就太好了。一个
int
是一个32位整数。如果您在64位计算机上,地址不是32位,而是64位
使用Int64
(long
)来匹配处理器的地址长度:
long scan0 = (long)handle.AddrOfPinnedObject();
或者,更好的是,打电话:
看看这个,堆栈跟踪显示了什么?它有任何内部异常吗?@Pavenhimself:不错的帖子,但不完全相关。使用IntPtr不是更正确吗?然后它应该适用于任何一种体系结构。@RenniePet:
handle
是一种IntPtr
。将构建“平台目标”设置为“x86”也解决了这个问题。但将变量更新为long似乎更为正确。谢谢。@user3149304:这是真的,因为它的运行方式与在32位平台上的运行方式相同。
long scan0 = handle.AddrOfPinnedObject().ToInt64();