Im Мессинг Arround с structlayouts и я нашел некоторые вещи я найти довольно странно:FatalExecutionEngineError когда Мессинг с StructLayouts
Следующий код работает так, как я думал, что это будет:
using System;
using System.Runtime.InteropServices;
public class Program
{
[STAThread]
static void Main()
{
Magic m = new Magic
{
InstanceA = new ClassA(),
InstanceB = new ClassB {Value="47"}
};
Console.WriteLine(m.InstanceA.Value);
Console.ReadKey();
}
class ClassA
{
public dynamic Value;
}
class ClassB
{
public string Value; // Change to int and it will get messy
}
[StructLayout(LayoutKind.Explicit)]
struct Magic
{
[FieldOffset(0)]
public ClassA InstanceA;
[FieldOffset(0)]
public ClassB InstanceB;
}
}
Однако, если вы измените classB.Value to int, этот код будет вызывать упомянутый FatalExecutionEngineError.
Может ли кто-нибудь объяснить, почему или, может быть, на рабочем месте? Я знаю, что это, вероятно, слишком сложно, и я просто возился здесь, но кому-то может понадобиться вызов.
Это * действительно * плохой предмет * все равно *; Наложение ссылок - это ... gah. Почему не просто одно поле «объект» и два свойства, которые используют это поле? Также ... mutable struct, public fields и т. Д. P –
Вы должны использовать только явный макет, если вы точно знаете, что делаете. Он предназначен для неуправляемых сценариев взаимодействия, а не «просто возиться». См. Http://stackoverflow.com/q/23323696/517852. –
Что предназначено для возиться? ^^ ... Я понял, что вы говорите. – CSharpie