Ich muss native Strukturen aus verwalteten Klassen füllen. Folgende Technik (1. kopiere verwaltete Daten in ein verwaltetes Byte-Array, 2. benutze memcopy, um die native Struktur zu füllen), fand ich eine übliche Lösung dafür. Ich nehme an, der Grund, warum der folgende Code nicht funktioniert, ist, dass ich verwaltete Klassen nicht verwaltete Strukturen verwende. Klassen verwalten ist eine Voraussetzung in meinem Projekt. Kann ich diesen Code mit verwalteten Klassen arbeiten lassen oder muss ich zu verwalteten Strukturen wechseln?Kopieren von verwalteter Klasse in systemeigene Struktur
dies ist die C# verwaltete Klasse:
[StructLayout(LayoutKind.Sequential)]
public class man_s
{
public man_s()
{
// (do something which i can't do in a struct!)
}
// should go into a one-byte native bool
[MarshalAs(UnmanagedType.I1)]
public bool flag1;
public Int32 a;
public Int32 b;
};
... die native CPP-Struktur:
struct nat_s
{
public:
bool flag1;
__int32 a;
__int32 b;
};
... der Code, der die verwalteten Daten in die native Struktur kopieren sollten:
// setup some managed data
man_s^ mng = man_s();
mng->flag1 = true;
mng->a = 10;
mng->b = 20;
nat_s nat;
int s = sizeof(nat);
// size check is ok!
System::Diagnostics::Debug::Assert(sizeof(nat) == System::Runtime::InteropServices::Marshal::SizeOf(mng));
// copy into managed byte array
array<byte>^ byteArray = gcnew array<byte>(s);
System::Runtime::InteropServices::Marshal::Copy(IntPtr((void*)(&mng)), byteArray, 0, s);
// this doesn't bring up the expected results
pin_ptr<byte> start = &byteArray[0];
memcpy(&nat, start, s);
// does not work either
System::Runtime::InteropServices::Marshal::Copy(byteArray, 0, IntPtr((void*)(&nat)), s);enter code here
danke gute Wahl – deafjeff