![](/img/trans.png)
[英]Allocating array in unmanaged C++ code after passing IntPtr pointer in C#, Marshaling Types
[英]Marshaling a pointer to an array of types (managed C# -> unmanaged C++)
我在解決一種表示結構的方法上遇到了麻煩,該結構包含一個指向托管代碼中短褲數組的指針。 該結構如下所示:
typedef struct
{
short size;
unsigned short** shortValues;
} UnmanagedStruct;
“ shortValues
”的內存是在非托管代碼中分配的-因此,即使該字段只是指向短值數組的指針,也添加了附加級別的間接尋址,以便調用者(托管代碼)也可以看到分配的內存。 “ size
”字段表示數組中元素的數量。 我該如何在托管代碼中表示呢?
我以為只在IntPtr
傳遞了它,所以一旦非托管調用返回,我想不通如何訪問這些值。
不安全的代碼可以嗎?
public unsafe struct UnmanagedStruct
{
public short size;
public ushort** shortValues;
}
[DllImport("example.dll")]
public static extern void GetUnmanagedStruct(out UnmanagedStruct s);
如果您有一個指向ushort
數組的指針:
public static unsafe void WriteValues()
{
UnmanagedStruct s;
GetUnmanagedStruct(out s);
for (var i = 0; i < s.size; i++)
{
ushort x = (*s.shortValues)[i];
Console.WriteLine(x);
}
}
如果您有ushort
s的以null結尾的數組:
public static unsafe void WriteValues()
{
UnmanagedStruct s;
GetUnmanagedStruct(out s);
for (var i = 0; i < s.size; i++)
{
for (ushort* p = s.shortValues[i]; p != null; p++)
{
ushort x = *p;
Console.WriteLine(x);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.