このマーシャリングをダウンさせるのに本当に苦労しています。
次のような umanaged コードがあります。
WORD HLP_GetDeviceNames (LPSTR *DevNames, WORD Max_Len, WORD Max_Num)
参考までに、私はこのアンマネージ コードを作成していませんが、使用する必要があります。
戻り値: エラーを示す WORD。
DevNames: char 配列の配列へのポインター。基本的に、変更されて返される文字列の配列です!
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と関係があると思います。これが事実であっても、それを修正する方法がわかりません。
誰でも提供できる洞察に感謝します!