Microsoft MVP성태의 닷넷 이야기
C# 마샬링 관련 질문이 있습니다. [링크 복사], [링크+제목 복사],
조회: 13194
글쓴 사람
황상대
홈페이지
첨부 파일
 

C/C++

구조체
typedef char Str20[20];

typedef struct UpdateStruct {
    int count;
    Str20 *update;
} UPDATE;
함수
BOOL GetUpdateList(UPDATE *updateList);

위와 같이 C언어로 작성된 DLL라이브러리가 있습니다.
구조체를 통해 업데이트 리스트를
받아오는 함수입니다.
다음은 이 함수를 C#에서 사용하기 위해 제가 사용한 방법입니다.
C#
구조체
        public struct UPDATE
        {
            public int count;
            public IntPtr update;
        }
함수
        static extern int GetUpdateList(ref UPDATE updatelist);
사용
       while(true){
        UPDATE updateList = new UPDATE();
        GetUpdateList(ref updateList)
        /* 업데이트 작업 */
       }
이 방법대로 이용하니 업데이트리스트를 받아와지기는 하나 반복적으로 돌게 되면 AccessViolationException이 발생합니다.

해결책이 없을지 궁금하여 질문드립니다.








[최초 등록일: ]
[최종 수정일: 1/26/2015]


비밀번호

댓글 작성자
 



2015-01-26 12시13분
C#은 update IntPtr에 저장된 데이터가 몇 바이트인지 알 길이 없습니다. 따라서, Str20 *update의 첫번째 포인터 값만 IntPtr update로 받아올 뿐입니다. 그 이후의 데이터는 없기 때문에 AccessViolationException이 발생하는 것입니다.

이런 경우에는 update의 배열 수를 명시하고 count가 만족될 때 까지 루프를 돌면서 구하는 방법이 있습니다. 아니면 update 포인터 자체를 액면 그대로 포인터로 받아와서 사용해야 합니다. (해보시고, 정히 안되시면 재현 가능한 최소한의 예제 프로젝트를 압축해서 올려주세요.)

혹은, COM인 경우라면 IDL에 마샬링 정보가 있기 때문에 다음과 같은 식의 처리가 가능합니다.

[in,out] 배열을 C#에서 C/C++로 넘기는 방법 - 두 번째 이야기
; http://www.sysnet.pe.kr/2/0/811
정성태

... 61  62  63  64  65  [66]  67  68  69  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
913정성태10/11/201014130    답변글 [답변]: 윈도우즈 인증서 관련해서 문의를 드립니다.
911나그네.10/6/201012990안녕하세요.. openssl 관련하여...혹시.. [2]
910윤용한9/17/201012641Visual Studio 2010으로 만든 Setup 파일을 Win2000 SP4에 설치 되게 할 수 없나요? [1]
908김재영9/7/201011196솔루션에 구성된 프로젝트의 버젼만 통합할려면 어떤 방법이 있습니까?
909정성태9/7/201012643    답변글 [답변]: 솔루션에 구성된 프로젝트의 버전만 통합할려면 어떤 방법이 있습니까? [1]
906임동찬8/19/201012518디버깅 중 이해할 수 없는 상황이 [1]
904김영태8/18/201013885C# Interop 관련 질문입니다. [1]
905김영태8/19/201014876    답변글 [답변]: C# Interop 관련 질문입니다. [4]
903임동찬8/17/201010859COM 객체의 타입 변경 [1]
902임동찬8/16/201010778DISPPARAMS 관련 질문 [4]
901노력자8/11/201014536.net 2008 c# 에서 만든 com+ 는 com탭에서 사용불가..?! [3]파일 다운로드1
900박정환8/9/201012638wsHttpBinding을 WS-Addressing 없이 세팅할 수는 없을 까요? [7]
899임동찬7/30/201013171WCF heartbeat 관련 질문 [3]
898이영기7/29/201011053.NET 웹용에서 함수호출에러 [1]
897임동찬7/16/201012783Visual Studio 2008에서 DB연결 관련 문제 [1]
894최종문7/14/201011019try/finally 에 관해서 문의 드립니다.
895정성태7/15/201010916    답변글 [답변]: try/finally 에 관해서 문의 드립니다.
896최종문7/15/201011983        답변글 [답변]: [답변]: try/finally 에 관해서 문의 드립니다. [1]
893이병준 donator7/7/201013060Visual Studio 2010 에서의 Build 관련 질문 [1]
889임동찬7/6/201011318아래 887번에 대한 추가 질문
890정성태7/6/201012835    답변글 [답변]: 아래 887번에 대한 추가 질문
891임동찬7/6/201012917        답변글 [추가]: [답변]: 아래 887번에 대한 추가 질문
892정성태7/6/201010377            답변글 [답변]: [추가]: [답변]: 아래 887번에 대한 추가 질문
888김재영7/5/201010212TFS에 반드시! SQL Report랑 SharePoint(or WSS)가 붙어야 합니까? [2]
887임동찬7/2/201010995WCF sendTimeout에 관하여... [1]
886김재영6/16/201011086스레드 선언시 (Parameterized/)ThreadStart에 정의되는 메소드의 위치에 질문이 있습니다. [3]
... 61  62  63  64  65  [66]  67  68  69  70  71  72  73  74  75  ...