我正在工作的标签阅读器,我能够连接它并阅读一些数据。我的问题是当我试图读取标签ID,这是一个大字符序列。尝试读取或写入受保护的内存时尝试通过C#中的大字符序列
该SDK是C语言,我正在开发一个C#应用程序。
short GetIDBuffer(HANDLE hCom, unsigned char* DataFlag, unsigned char * Count,
unsigned char *value, unsigned char* StationNum)
以我C#应用程序:
[DllImport("Reader2.dll",CharSet = CharSet.Ansi)]
public static extern short GetIDBuffer(IntPtr hCom, ref uint DataFlag,
ref uint Count, ref String value, ref uint StationNum);
Dataflag,计数,站号主要其中一个uint类型做得很好小序列。但是当涉及到值这是一个很大的序列。我试过型串但它抛出这个异常:
试图读取或写入保护内存。这通常是指示其他内存已损坏的 。
[的MarshalAs(UnmanagedType.LPWStr)]字符串值
didnt解决问题
计数正确返回值
我的操作系统是64位:我用
corflags application.exe/32bit+
,我能够加载DLL正确。
代码快照:
[DllImport("Reader2.dll")]
public static extern byte OpenReader(ref IntPtr hCom, byte LinkType, string com_port, uint port);
[DllImport("Reader2.dll")]
public static extern short GetIDBuffer(IntPtr hCom, ref byte DataFlag, ref byte Count,**(type)** value , ref byte StationNum);
static void Main(string[] args)
{
byte count = 0, station = 1, flag = 0;
IntPtr hcom = IntPtr.Zero;
OpenReader(ref hcom, 2, "192.168.0.178", 4001);
// valid handle returned from openReader
//
**GetIDBuffer code**
//
使用StringBuilder替代,降* REF *。一定要用足够大的容量来初始化它。猜测它错误腐化堆。 – 2012-03-14 19:48:41
tank hans, StringBuilder value = new StringBuilder(“test”,1000); 返回“{}”没有值。 有什么想法? – john 2012-03-14 20:15:51
看起来不错,pinvoke调用至少会将构建器重置为空字符串。当然不知道为什么。 – 2012-03-14 20:21:12