Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IndexOutOfRangeException-无法使用PInvoke查看调用堆栈 我开发了一个C程序,它从SerialPort获取数据,然后使用C++项目(我不能改变)来计算读取数据。 C++项目使用一些本地C代码,当计算数据时调用C函数。p>_C#_C++_C_Pinvoke_Indexoutofrangeexception - Fatal编程技术网

C# IndexOutOfRangeException-无法使用PInvoke查看调用堆栈 我开发了一个C程序,它从SerialPort获取数据,然后使用C++项目(我不能改变)来计算读取数据。 C++项目使用一些本地C代码,当计算数据时调用C函数。p>

C# IndexOutOfRangeException-无法使用PInvoke查看调用堆栈 我开发了一个C程序,它从SerialPort获取数据,然后使用C++项目(我不能改变)来计算读取数据。 C++项目使用一些本地C代码,当计算数据时调用C函数。p>,c#,c++,c,pinvoke,indexoutofrangeexception,C#,C++,C,Pinvoke,Indexoutofrangeexception,这是调用p++调用:C++函数的一些例子,调用p++: [DllImport("MyLib.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] public static extern void PacketHandler_HandlePacket(IntPtr packetHandler, IntPtr packet, int packetType); [Suppres

这是调用p++调用:C++函数的一些例子,调用p++:

    [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;
}
var intptrDelegate = Marshal.GetFunctionPointerForDelegate(DelegateCallbackBattery);
var a = Marshal.GetDelegateForFunctionPointer(intptrDelegate, typeof(DelegateBattery));
PacketHandler_AddCallbackBattery(packetHandler, a);
最后,C代码将调用“addSampleToPattery”函数,这是C#回调(其中前两个是PInvoke调用,就像我发布的第一个一样)

其他详情:

C#代表声明如下:

 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
 private delegate float DelegateBattery(IntPtr self, short sample);

 private static readonly DelegateBattery DelegateCallbackBattery = CallbackBattery;
并设置如下:

__declspec(dllexport) void _cdecl  PacketHandler_AddCallbackBattery(int * packetHandler, void(*f)(void * obj, unsigned short int sample)){
    PacketHandlerStruct * myPointer = ((PacketHandlerStruct *)packetHandler);
    myPointer->delegate.addSampleToBattery = f;
}
var intptrDelegate = Marshal.GetFunctionPointerForDelegate(DelegateCallbackBattery);
var a = Marshal.GetDelegateForFunctionPointer(intptrDelegate, typeof(DelegateBattery));
PacketHandler_AddCallbackBattery(packetHandler, a);
所以,一切似乎都是可行的,但很多时候都会出现索引自动异常。主要问题是,即使在加载了所有符号的调试模式下,我也看不到引发异常的行,因为只有反汇编视图可用,当然我无法从中获得有意义的信息

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相对应的语义表示您试图访问的内存距离基内存地址太远,因此不应尝试遵从内存中的该点

想象一个由3个元素组成的整数数组。如果您尝试索引[3],即*(base_address+(sizeof(int)*3))*被取消引用,以便内存中该位置的下4个字节作为int值提供。唯一有效的索引是0、1和2,因为这些偏移量在我们为其分配空间的3个元素的范围内


我们仍然需要更多的代码,因为我看不出这些代码与异常消息有什么关系。

调用@hanspassantThank@JonathonReinhart;)这里没有足够的信息。不幸的是,我不知道应该提供哪些信息,以便让其他用户更好地了解问题。相同的C代码正在另一个应用程序中运行,因此问题不存在,它似乎随机抛出异常,因此在同一函数中的给定时间段后不会出现异常。我怎样才能帮助您更好地理解这个问题?谢谢你提供了很少的代码。显然有人回电话了。我们看不到它。你能做的就是做一个MCVE。如果你不能这样做,那么你可以从界面的功能C或C++用户和你的匹配C代码中显示所有相关代码。