[CPP][C#]
※追記 これはダメなやり方。
※MarshalクラスのMarshal.PtrToStructure()/Marshal.StructureToPtr()を使おう
※
※ネタ元
これで正解なのかわからないが、とりあえずできたのでメモ。
C#の方はunsafeを有効にしておく。

C#側
[DllImport("kernel32.dll")]
static extern unsafe void CopyMemory(void* dst, void* src, int size);
// 受け渡し用構造体(32bit前提)
[StructLayout(LayoutKind.Sequential)]
public struct StData
{
public Int32 data0;
public Int32 data1;
public Int32 data2;
public Int32 data3;
public Int32 data4;
};
public bool GetData(int p_data){
StData data;
data.data0 = 100;
data.data1 = 200;
data.data2 = 300;
data.data3 = 400;
data.data4 = 500;
unsafe
{
CopyMemory((void*)p_data, &p_data, sizeof(StData));
}
}
C++側(32bitアプリ)
// 受け渡し用構造体
typedef struct _StData
{
long data0;
long data1;
long data2;
long data3;
long data4;
}StData;
...
{
CoInitialize(0);
{
CCSharpModule obj;
if( obj.CreateDispatch(CLSID_CSharpModule) != FALSE ){
StData st_data;
obj.GetData((long)&st_data);
}else{
// 失敗
}
// 後片付け
obj.ReleaseDispatch();
}
CoUninitialize();
}
C#でDLLを作ってC++から呼ぶ基本手順はこちら
ネタ元