我很难把这个编组下来。
我有如下所示的非托管代码:
WORD HLP_GetDeviceNames (LPSTR *DevNames, WORD Max_Len, WORD Max_Num)
仅供参考,我没有编写此非托管代码,但必须使用它。
返回: WORD 指示错误。
DevNames:指向字符数组数组的指针。基本上是一个字符串数组,将被修改并返回给我!
Max_Len:每个字符串的长度(我被告知这必须是 256)
Max_Num:数组的长度。我正在使用另一个正在运行的 Invoke 调用,它告诉我设备的数量,所以我确切地知道要发送多少个字符串。
我已经使用 P/Invoke interop signatureToolkit 来解决这个问题,但也阅读了一堆以获得更进一步的信息。我现在在这里:
[DllImport("UsbMeasLib.dll")]
public static extern ushort HLP_GetDeviceNames([MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr)] ref StringBuilder[] DevNames, ushort Max_Len, ushort Max_Num);
我这样称呼我的代码:
StringBuilder[] DevNames = new StringBuilder[deviceCount];
for(int i = 0; i< deviceCount; i++)
{
DevNames[i] = new StringBuilder().Append(' ', 256);
}
HachUsbMeasLib.HLP_GetDeviceNames(ref DevNames, 256, Convert.ToUInt16(DevNames.Count()));
我正在使用字符串生成器数组,因为我需要非托管代码来修改字符串生成器,以便它可以返回新字符串,因为字符串是不可变的。
当我运行代码时,我的数组未修改!
我不太确定发生了什么,但我认为这与 CLR 告诉非托管代码不要修改我的数组而是创建一个新的引用(指针)有关。即使是这种情况,我也不知道如何解决它。
感谢任何人可以提供的任何见解!