안녕하세요 잘지내시죠? 날씨가 참 덥네요..
날씨도 더운데 이런 질문 드려도 괜찮을지 모르겠네요..
근데 며칠째 답이 안나와서요 ㅠㅠ 질문 좀 드릴께요.
다름이 아니라
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]