C # StructLayout.Perguntas explícitas
Estou tentando entender por que o segundo exemplo abaixo funciona sem problemas, mas o primeiro exemplo me dá a exceção abaixo. Parece-me que ambos os exemplos devem dar uma exceção baseada na descrição. Alguém pode me esclarecer?
Exceção não tratada: System.TypeLoadException: não foi possível carregar o tipo 'StructTest.OuterType' do assembly 'StructTest, versão = 1.0.0.0, Culture = neutral, PublicKeyToken = null' porque contém um campo de objeto no deslocamento 0 incorretamente alinhado ou sobreposto por um campo não objeto.
em StructTest.Program.Main (String [] args) Pressione qualquer tecla para continuar. . .
Exemplo 1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
namespace StructTest
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct InnerType
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
char[] buffer;
}
[StructLayout(LayoutKind.Explicit)]
struct OuterType
{
[FieldOffset(0)]
int someValue;
[FieldOffset(0)]
InnerType someOtherValue;
}
class Program
{
static void Main(string[] args)
{
OuterType t = new OuterType();
System.Console.WriteLine(t);
}
}
}
Exemplo 2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
namespace StructTest
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct InnerType
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
char[] buffer;
}
[StructLayout(LayoutKind.Explicit)]
struct OuterType
{
[FieldOffset(4)]
private int someValue;
[FieldOffset(0)]
InnerType someOtherValue;
}
class Program
{
static void Main(string[] args)
{
OuterType t = new OuterType();
System.Console.WriteLine(t);
}
}
}