- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发一个从 SerialPort 获取数据的 C# 应用程序,然后它使用一个 C++ 项目(我无法更改)来计算读取的数据。
C++ 项目正在使用一些 native C 代码,这些代码将在计算数据时调用 C# 函数。
这是使用 PInvoke 调用 C++ 函数的调用 C# 代码的一些示例:
[DllImport("MyLib.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern void PacketHandler_HandlePacket(IntPtr packetHandler, IntPtr packet, int packetType);
[SuppressUnmanagedCodeSecurity]
[DllImport("MyLib.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
private static extern float DeviceManager_AddSampleToBattery(IntPtr self, float sample, double sampleRate);
[SuppressUnmanagedCodeSecurity]
[DllImport("MyLib.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
private static extern double DeviceManager_GetTimestamp(IntPtr self, int packetType);
[DllImport("MyLib.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
private static extern void PacketHandler_AddCallbackBattery(IntPtr self, Delegate @delegate);
然后,C++代码:
extern "C"
{
__declspec(dllexport) void _cdecl PacketHandler_HandlePacket(int * packetHandler, char * packet, int packetType){
PacketHandler_handlePacket((PacketHandlerStruct *)packetHandler, packet, (PacketHandlerPacketType)packetType);}
}
此 C 函数正在调用我设置如下的 C# 函数:
__declspec(dllexport) void _cdecl PacketHandler_AddCallbackBattery(int * packetHandler, void(*f)(void * obj, unsigned short int sample)){
PacketHandlerStruct * myPointer = ((PacketHandlerStruct *)packetHandler);
myPointer->delegate.addSampleToBattery = f;
}
最后,C 代码将调用“addSampleToBattery”函数,这是此 C# 回调(其中前两个是 PInvoke 调用,就像我发布的第一个一样)
private static float CallbackBattery(IntPtr self, ushort sample)
{
var value = DeviceManager_AddSampleToBattery(DeviceManager, sample, Const.BaseBvpSampleRate);
var timestamp = DeviceManager_GetTimestamp(DeviceManager, (int)PacketHandlerPacketType.Battery);
SocketManager.OnNewBatteryArrived(value, timestamp);
return value;
}
其他细节:
C# 委托(delegate)声明如下:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate float DelegateBattery(IntPtr self, short sample);
private static readonly DelegateBattery DelegateCallbackBattery = CallbackBattery;
然后这样设置:
var intptrDelegate = Marshal.GetFunctionPointerForDelegate(DelegateCallbackBattery);
var a = Marshal.GetDelegateForFunctionPointer(intptrDelegate, typeof(DelegateBattery));
PacketHandler_AddCallbackBattery(packetHandler, a);
因此,一切似乎都正常,但很多时候会发生 IndexOutOfRangeException。主要问题是,即使在加载了所有符号的 Debug模式下,我也看不到抛出异常的行,因为只有反汇编 View 可用,当然我无法从中获取有意义的信息。
Unhandled Exception: 'MyProgram.exe' (Win32):
The program '[3000] MyProgram.exe' has exited with code 0 (0x0).
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at System.Threading.ThreadPoolWorkQueue.Dequeue(ThreadPoolWorkQueueThreadLocals tl, IThreadPoolWorkItem& callback, Boolean& missedSteal)
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
谢谢!
最佳答案
与 IndexOutOfRangeException 对应的语义表明您试图访问距离基本内存地址太远的内存,因此您不应该尝试在内存中引用该点。 p>
考虑一个包含 3 个元素的 int 数组。如果您尝试索引 [3],即 *(base_address + (sizeof(int) * 3))* 被取消引用,以便内存中该位置的下一个 4 个字节作为 int 值提供。唯一有效的索引是 0、1 和 2,因为这些偏移量在我们为其分配空间的 3 个元素的范围内。
我们仍然需要更多代码,因为我看不出这些与异常消息有什么关系。
关于c# - IndexOutOfRangeException - 无法使用 PInvoke 查看调用堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28964993/
我想在文本框中显示数据库中的某些列。运行代码时,@ApplicantUsername出现错误 IndexOutOfRangeException 这是我的代码: cs.Open();
我基本上需要将任意数量的内容数组存储为一个整数,但之后我必须将其全部回显。 我收到索引超出范围错误。 for (int index = 0; index 0; index--, userArray-
当我尝试访问特定数组索引时,我正在寻找一种方法来防止 IndexOutOfRangeException。 我有一个通用代码,有时在 array[index] 中有值,有时则没有。 所以,在尝试获取它的
我不知道为什么:float val = spectrum[i];正在产生超出数组范围的索引。请帮忙...!我是这个游戏的新手。 public class InputScript : MonoBehav
我正在编写一个 Unity 脚本来读取 CSV 文件(二维和所有数字),将其分解为附加到二维 float 组的 float 。这是我的代码: using System.Collections; usi
这个问题在这里已经有了答案: What does IndexOutofRangeException mean? (3 个答案) 关闭 9 年前。 string Query = "SELECT [AA
我不明白为什么我会在下面的代码中遇到超出范围的异常。 _maxRowIndex 和 _maxColIndex 的值分别为 5 和 0。当 row 和 col 都等于 0 时,第一次抛出异常。我不明白为
程序在运行时说索引超出范围,但我不知道为什么。 错误信息指出的行是 点[计数器 + ((int)(radius * 100))].X = i; 如果那个有错误,下一个(具有相同索引)也一定有错误。 P
这个问题在这里已经有了答案: C# Creating an array of arrays (5 个答案) 关闭 7 年前。 我遇到了这个奇怪的 IndexOutOfRangeException 异
我正在制作一个简单的购物车。它从另一个页面上的按钮将产品添加到购物车页面,我的添加到购物车按钮如下所示 protected void addCart_Click(object sender, Eve
我不明白为什么我在下面的 Where 子句中得到它。 using System; using System.Linq; public static class Extensions { ///
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我有一个问题。我尝试实现 Zig-Zag 算法 ( Rail Fence )。 我的代码如下所示: int n = 3; int j = 0; int charCounter
在 Form1 构造函数中我有: if (System.IO.File.Exists(keywords_path_file)) { ListBo
我在一些任务中使用字典。 从逻辑上讲,我已将其设置为我的键永远不会发生冲突,但有时在我向字典添加内容时会出现此异常。 Index was outside the bounds of the array
我们目前在我们的一个应用程序中使用 SpreadsheetGear 来生成 Excel 工作簿。我试图在 ASP.NET Web 应用程序中重用其中的一些功能,但到目前为止我很难过。 我首先在 Web
我有以下映射: public class SecurityMap : ClassMap { public SecurityMap() {
我有一个非常简单的类,给出了一个奇怪的错误。该类只有1个属性,查询非常简单。最可怕的是,这似乎是随机发生的。收到此错误后,通常刷新页面可以使其变路,并且应用程序不会再出现此错误。 数据库连接可能有问题
我又遇到了另一个问题。我试图使用 DataReader 从数据库中获取数据,但在测试代码时出现错误。谁能帮我吗?错误发生在这一行: chkAssess = readAssess[columnName]
我还有另外两个按钮,代码几乎完全相同。但是,当我尝试运行此代码以获取所有结果时,出现错误“System.IndexOutOfRangeException”。 显示无效 NHS 号码按钮有效,但我不明白
我是一名优秀的程序员,十分优秀!