Я ищу способ переосмыслить произвольную небезопасную область памяти как структуру blittable в C #.Вот неудачная попытка, которую я мог написать до сих пор:
[StructLayout(LayoutKind.Explicit, Size = sizeof(int))]
struct Foo
{
[FieldOffset(0)]
public int X;
}
public static unsafe void Main()
{
// Allocate the buffer
byte* buffer = stackalloc byte[sizeof(Foo)];
// A tentative of reinterpreting the buffer as the struct
Foo foo1 = Unsafe.AsRef<Foo>(buffer);
// Another tentative to reinterpret as the struct
Foo foo2 = *(Foo*) buffer;
// Get back the address of the struct
void* p1 = &foo1;
void* p2 = &foo2;
Console.WriteLine(new IntPtr(buffer).ToString("X"));
Console.WriteLine(new IntPtr(p1).ToString("X"));
Console.WriteLine(new IntPtr(p2).ToString("X"));
}
Тем не менее, все адреса в печатной памяти разные (я ожидал, что будет напечатан один и тот же адрес).Первая попытка использует Unsafe.AsRef<T>(..)
, предоставленный Microsoft, где описание метода гласит:
Повторно интерпретирует данное местоположение как ссылку на значение типа T
.
Я не уверен, почему переосмысление здесь не выполняется должным образом.
Любой совет?