程序在运行时运行正常,但当我尝试单步执行时,我得到:
"未处理的类型' System.StackOverflowException'发生在未知模块中。"
以下是代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace PInvokeTest
{
class Program
{
static void Main(string[] args)
{
int session_handle = 0;
int flag = 0;
int didsetup = 0;
int defPort = 0;
int i = 0, j = -1;
short[] ROM;
ROM = new short[9];
short type_test = 0;
short port_num = 0, port_type = 1;
byte[] state_buf = new byte[5125];
StringBuilder ID_buf = new StringBuilder();
StringBuilder serial = new StringBuilder();
StringBuilder serialtmp = new StringBuilder();
//Finds default device type and port
defPort = TMReadDefaultPort(out port_num, out port_type);
// get the TMEX driver version
Get_Version(ID_buf); // STACKOVERFLOW EXCEPTION HERE
...
Console.ReadKey();
}
[DllImport("IBFS32.dll")]
public static extern int TMExtendedStartSession(
short PortNum,
short PortType,
IntPtr EnhancedOptions
);
[DllImport("IBFS32.dll")]
public static extern short TMReadDefaultPort(
out short port_num,
out short port_type
);
[DllImport("IBFS32.dll")]
public static extern short Get_Version(
[MarshalAs(UnmanagedType.LPStr)]StringBuilder ID_buf
);
[DllImport("IBFS32.dll")]
public static extern short TMGetTypeVersion(
short port_type,
[MarshalAs(UnmanagedType.LPStr)]StringBuilder ID_buf
);
[DllImport("IBFS32.dll")]
public static extern short TMSetup(
int session_handle
);
[DllImport("IBFS32.dll")]
public static extern short TMNext(
int session_handle,
byte[] state_buf
);
[DllImport("IBFS32.dll")]
public static extern short TMRom(
int session_handle,
byte[] state_buf,
short[] ROM
);
[DllImport("IBFS32.dll")]
public static extern short TMEndSession(
int session_handle
);
}
}
什么会导致它只在你没有踩踏时运行它? 我有另一个使用非常相似的代码的程序(dll函数在不同的类中),但无论它是如何运行的,它都会获得stackoverflow异常。
编辑:
当我使用这个dll的64位版本并在x64中构建我的程序时,它始终正常工作......我不知道这些信息是否对你有任何帮助。
我需要运行32位版本。
答案 0 :(得分:1)
您必须指定StringBuilder的初始容量(通过构造函数),以确保它足够大以存储结果。您正在调用默认构造函数。
您可以传递一个System.Text.StringBuilder对象;一个指针将由编组程序传递给可以操作的非托管函数。 唯一需要注意的是StringBuilder必须为返回值分配足够的空间,否则文本会溢出,导致P / Invoke抛出异常。
StringBuilder ID_buf = new StringBuilder(MaxVersionLength);
答案 1 :(得分:0)
什么会导致它只在你没有踩踏时运行它?
很可能您在 Release 中运行代码,但在 Debug 中跳过,在这些情况下,由于 Debug 模式期间所需的其他信息,可用堆栈大小减少,因此堆栈上用于具体代码执行的可用内存变小,这会在堆栈已满时生成堆栈溢出异常。
顺便说一句,你有一个stackoverflow危险异常,所以最好修复它,直到你在 Release 中遇到同样的问题,所以在生产中。