Microsoft MVP성태의 닷넷 이야기
C# 마샬링 관련 문의입니다 [링크 복사], [링크+제목 복사],
조회: 20505
글쓴 사람
김덕성
홈페이지
첨부 파일
 

안녕하세요 잘지내시죠? 날씨가 참 덥네요..
날씨도 더운데 이런 질문 드려도 괜찮을지 모르겠네요..
근데 며칠째 답이 안나와서요 ㅠㅠ 질문 좀 드릴께요.

다름이 아니라
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]


비밀번호

댓글 작성자
 



2013-07-05 02시29분
Pack = 1로 지정했는데, C++의 PTSUPV 구조체도 1바이트 정렬로 되어 있나요? 일단, 문제의 범위를 좁히기 위해서 Divide&Conquer 방식을 사용해 보세요. ^^ PTSUPV 구조체에서 필드 하나씩 넣어가다 보면 어디에서 문제가 발생하는 지 더 잘 알 수 있을 것입니다. (전체적으로 봤을 때는, 잘 하신 것 같은데요. ^^)
정성태
2013-07-05 03시46분
[김덕성] 답변 감사드립니다. 일단 결론부터 말씀드리면 해결했습니다. ^^
원인은 정확히 모르겠는데 class 로 정의한 것들을 struct 로 바꾼 것만으로 해결이되네요...
처음에 배열 관련된 마셜링 시 컴파일 오류나서 찾아보니 class 로 해주라고 해서 바꾼건데 오히려 그것 때문에
하루 동안 고생했네요 ㅠㅠ 어찌되었건 도움 주시니 감사드리구요. 더운 여름 건강하게 잘 나시길 기원합니다.
그럼 안녕히 계세요
[guest]
2013-07-05 04시30분
아... ^^ 소스 코드를 보니 정말 class로 해놓으셨네요. 그러게요. pack 문제가 아니면 잘 하신 것 같아서 딱히 문제를 집어낼 수 없었는데. ^^
정성태

... 16  17  18  19  20  21  22  23  24  25  26  [27]  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
5219티지레몬9/9/20199696c# PCB 자동화 프로그램(윈도우 폼 위주로 작업) 제작 준비 [3]
5218민성9/9/20197741안녕하세요 WPF에서 xaml 안에 다른 xaml을 넣고 싶습니다. [1]파일 다운로드1
5216WPF9/8/20198824WPF에서 XAML Islands를 사용하여 Win2D를 사용하니 그래픽 품질이 저하됩니다. [2]파일 다운로드1
5215허송세월9/5/20198633중복실행 방지 관련 문의 [2]파일 다운로드1
5214Jang...9/4/20198259[DB 테이블의 데이터 변경에 대한 알림 처리] SQL-Server말고 MySQL은 불가능하겠죠? [1]
5213진우8/31/20197509c# 람다 변수 캡쳐 문의 [2]
5212심성보8/29/20199190Clipboard내 여러개의 이미지를 PictureBox로 불러오는 문제 [2]
5211최휘철8/24/20198356CLR20r3 관련된 윈도우 오류입니다. ㅠㅠ 도와주세요. / 아래글 관련하여 관련 파일 올려 드려요^^ [1]파일 다운로드1
5210최휘철8/23/201912261CLR20r3 관련된 윈도우 오류입니다. ㅠㅠ 도와주세요. [5]
5209세퉁8/21/20197895폰트 파일 속성 값을 가져오는 방법 질문 드립니다. [2]파일 다운로드1
5208홍길동8/19/20198723DebugDiag에서 .Net의 Stack Trace를 Windbg에서는 어떻게 볼 수 있나요? [3]
5207민성8/16/20197074네 소스 전체를 올리도록 하겠습니다. [2]파일 다운로드1
5206민성8/14/20197207전 재현 가능하다고 봤는데 다시올리도록 하겠습니다. [1]
5205miny...8/14/20198043안녕하세요 .WPF ListBox시 체크박스가 있는데 체크박스에서 체크가 되었는지 알수 있는 방법이 있을까요? [1]
5204영민8/8/201910809안녕하세요 디버깅시 콘솔창을 띠어서 볼수가 없나요? [7]
5202민성8/6/20197547WPF에서 <Application.Resources에 xaml에 있는 icon 값을 저장하고 xaml에 불러다 사용하고 싶은데요 [1]
5201김대훈8/3/20197151상속시 생성자에 대해 질문드립니다 [3]
5200농상7/30/20199849foreach로 데이터 변경 [2]
5190오리다람7/20/20197263질문드립니다. [3]
5189진우7/19/20197824C# 스레드풀 코어별 실행 문의 [2]
5188황태관7/19/20197017비주얼베이직 2019 실행 할때 마다.. [3]
5187플하7/19/20199832UWP 관련 궁금한 사항에 대해서 [1]
5186김대훈7/14/20198447박싱과 언박싱에 대해 [2]
5185농상7/13/20197318Nullable에 대해서 [1]
5184김대훈7/4/20197172저자님의 책을 다 본후에는 [2]
51837/2/20197895.NET Compact Freamwork 컨트롤러 더블버퍼링 [1]
... 16  17  18  19  20  21  22  23  24  25  26  [27]  28  29  30  ...