Я хочу связать некоторый управляемый объект в .Net для обработки его данных в байтовый массив. Для закрепления и справляясь я использую следующий код:GCHandle. Как связать объект, который содержит поля, определенные как класс
C c = new C();
byte[] b = new byte[Marshal.SizeOf(c)];
GCHandle gch = GCHandle.Alloc(c, GCHandleType.Pinned);
Marshal.Copy(gch.AddrOfPinnedObject(), b, 0, b.Length);
gch.Free();
И когда я объявляю мои определения объектов, как Folow:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct A
{
public int a;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct C
{
public A a0;
public A a1;
public A a2;
}
Все отлично работает. Когда я объявляю свои определения объектов следующим образом:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct A
{
public int a;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
class C
{
public A a0;
public A a1;
public A a2;
}
Также все работает нормально. Но когда я объявляю оба мои объекты как класса: «Объект содержит непримитивный или не blittable данные»
[StructLayout(LayoutKind.Sequential, Pack = 1)]
class A
{
public int a;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
class C
{
public A a0;
public A a1;
public A a2;
}
затем ArgumentException выбрасывается в GCHandle.Alloc (...)
Почему, когда A определен как структура, все работает нормально. Но когда класс не работает? Можно ли выполнить эту работу с обоими типами A и C, определенными как классы?
[This] (http://stackoverflow.com/questions/15544818/non-blitable-error-on-a-blitable-type) может помочь –