안녕하세요 잘지내시죠? 날씨가 참 덥네요..
날씨도 더운데 이런 질문 드려도 괜찮을지 모르겠네요..
근데 며칠째 답이 안나와서요 ㅠㅠ 질문 좀 드릴께요.
다름이 아니라
C++ 코드로 작성된 struct 를 마샬링을 사용하여 C# 에서 사용하려고 하는데요
마샬링을 접한지 이제 이틀되어 솔직히 잘 모르는 부분이 많습니다.
아래와 같이 문제가 있어 질문드립니다.
======================== C++ 코드 ====================
Data.DLL
1) 구조체
typedef struct tagDSPConf
{
DEVICEdevice;
PTSUPVptSupv[2];
CBSUPV cbSupv;
}DSPCONF;
2) 함수
DSPCONF* WINAPI GetDSPParameter()
{
DSPCONF returnData;
memcpy(&returnData, &g_DSPConf, sizeof(g_DSPConf));
return &returnData;
}
===================== C# 코드 ===========================
1) C++ 함수 정의
[DllImport("MFRData")]
internal static extern IntPtr GetDSPParameter();
2) 함수 정의
public DSPCONF GetDSPParameterData()
{
IntPtr ptr = GetDSPParameter();
DSPCONF pData = (DSPCONF)Marshal.PtrToStructure(ptr, typeof(DSPCONF));
return pData;
}
위와 같이 작성하여 디버그 모드 실행 시
위 c# 함수 public DSPCONF GetDSPParameterData() 상의
DSPCONF pData = (DSPCONF)Marshal.PtrToStructure(ptr, typeof(DSPCONF)); <- 이 부분에서
처리되지 않은 'System.ExecutionEngineException' 형식의 예외가 mscorlib.dll에서 발생했습니다.
라는 오류가 뜹니다.
며칠째인데 원인을 잘모르겠네요 ㅠㅠ 조언 좀 부탁드려요...
---------------->
다시 디버깅을 하다보니 마샬링할때 고정길이 구조체 배열 부분이 잘 안되서 전체가 안되는 것 같습니다.
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class DSPCONF
{ // Offset (Modbus)
[MarshalAs(UnmanagedType.Struct)]
public DEVICE device; // 0000 0000
[MarshalAs(UnmanagedType.Struct)]
public POWERSYSTEM powerSys; // 0040 0020
[MarshalAs(UnmanagedType.Struct)]
public CALIBRATION cali; // 00C0 0060
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 2)]
public PTSUPV[] ptSupv; // 0140 00A0
}
가장 하단의 public PTSUPV[] ptSupv; <-이 부분이 정상적으로 마샬링 되지 않고 ? 로 데이터가 들어가고
그 윗부분은 모두 정상적으로 데이터가 들어옵니다.
PTSUPV 구조체는 아래와 같습니다.
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class PTSUPV
{
public UInt32 uFunction; // 0:OFF, 1:ON
public UInt32 uPartialLoss; // 0:OFF, 1:ON
public UInt32 uAllLoss; // 0:OFF, 1:ON
public float fDelayTime1; // 0.05 ~ 300.00 sec / 0.01 sec
public float fDelayTime2; // 0.05 ~ 300.00 sec / 0.01 sec
public UInt32 uInhibit; // 0:NO, 1:YES
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public UInt32[] uReserved;
}
혹시 제가 잘못알고 있는 부분이 있는지 조언 부탁드립니다... 구글링도 할만큼 했는데 잘 안되네요 ㅠㅠ
[최초 등록일: ]
[최종 수정일: 7/4/2013]