本文介绍了编组结构到单行字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class Comarea
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1)]
public string status;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
public string operationName;
}
public static void StringToObject(string buffer, out Comarea comarea)
{
IntPtr pBuf = Marshal.StringToBSTR(buffer);
comarea = (Comarea)Marshal.PtrToStructure(pBuf, typeof(Comarea));
}
我可以从字符串的单行创建对象,但不能做相反的事情.
I can create object from single line of string but I can not do opposite of that.
我该怎么做?
public static void ObjectToString(out string buffer, Comarea comarea)
{
???
}
它引发异常试图读取或写入受保护的内存.这通常表明其他内存已损坏."
It throws exception "Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
int size = Marshal.SizeOf(comarea);
IntPtr pBuf = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(comarea, pBuf, false);
buffer = Marshal.PtrToStringBSTR(pBuf); //Error
推荐答案
这就是我解决问题的方法:我使用了char数组和Marshal.PtrToStringAuto(pBuf, size)
That is how I solved my problem: I used char array and Marshal.PtrToStringAuto(pBuf, size)
public static void ObjectToString(out string buffer, Comarea comarea)
{
int size = 0;
IntPtr pBuf = IntPtr.Zero;
try
{
size = Marshal.SizeOf(comarea);
pBuf = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(comarea, pBuf, false);
buffer = Marshal.PtrToStringAuto(pBuf, size).Substring(0, size/2); // Answer
}
catch
{
throw;
}
finally
{
Marshal.FreeHGlobal(pBuf);
}
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct Comarea
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
private char[] status;
public string Status
{
get
{
return new string(status);
}
set
{
status = value.ToFixedCharArray(1);
}
}
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
private char[] operationName;
public string OperationName
{
get
{
return new string(operationName);
}
set
{
operationName = value.ToFixedCharArray(5);
}
}
}
public static class FormatterExtensions
{
[DebuggerStepThrough]
public static char[] ToFixedCharArray(this string inputString, int arrayLength)
{
char[] outputArray = new char[arrayLength];
char[] inputArray = inputString.ToSafeTrim().ToCharArray();
if (inputArray.Length == arrayLength)
{
return inputArray;
}
else
{
int i = 0;
while (i < arrayLength)
{
if (i < inputArray.Length)
{
outputArray[i] = inputArray[i];
}
else
{
break;
}
i++;
}
return outputArray;
}
}
}
它对于IBM CICS通信(对于Commarea)非常有用
It is so useful for IBM CICS communication(For Commarea)
这篇关于编组结构到单行字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!