管理対象クラスからネイティブ構造体を埋める必要があります。テクニックに従う(1.マネージドバイト配列にマネージドデータをコピーする、2. memcopyを使ってネイティブ構造体を埋め込む)私はこれに対する共通の解決策であることが分かった。 次のコードが機能しない理由は、マネージドクラスをマネージド構造体ではなく使用していることです。私のプロジェクトでは、クラスを管理することが必須条件です。このコードをマネージドクラスを使用して動作させることができますか、またはマネージド構造体に切り替える必要がありますか?管理対象クラスからネイティブ構造体へのコピー
[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;
};
...ネイティブCPP構造体:
struct nat_s
{
public:
bool flag1;
__int32 a;
__int32 b;
};
...ネイティブ構造体に管理されたデータをコピーしてくださいコード:
この
は、C#のマネージクラスです// 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
おかげで良い選択 – deafjeff