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

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
정성태

... 16  17  18  19  20  21  22  23  [24]  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
5319권대현4/10/20206227C++(UWP)Dll에서 C#(UWP)Dll 호출이 가능한가요? [1]
5318이승준4/9/20207084동영상 관련 업계 근황? 입니다. [1]
5317kskk...4/7/20209102OpenCV 이용 해상도 설정 질문 입니다.. [3]
5316윤현수4/7/20206336pipe 비동기방식 질문 [1]파일 다운로드1
53154/6/20207001dll파일 로드 원리? 부분에서 도움받고싶습니다. [3]
5314강성욱3/31/20208877메서드 내에서 await 2번 등장할 때의 이해 [11]파일 다운로드1
5313강성욱3/27/20206682await 2번 [1]
53121a2a...3/20/20206452Re raw data write 질문 관련 [1]파일 다운로드1
53111a2a...3/20/20207253Raw data write 관련 질문 [1]파일 다운로드1
5310아스파넬3/15/202072791초에 5회 함수호출 제한 관련 질문입니다. [1]
5309하태3/11/20209179안녕하십니까. c# Winform UI 질문드리겠습니다! [3]파일 다운로드1
5308질문3/9/20207963Window XP SP3 32bit 환경(Window Update 모두 완료)에서 .Net Framework 4.0.3 으로 빌드된 .dll 파일 gacutil.exe 등록 관련 문의 [5]
5306개발자3/9/20206833C#을 통해 인터넷 접속 가능한 이더넷을 선택할 수 있는지요? [1]
5305JaeS...3/9/20206509RAW파일 생성 질문드립니다 [8]파일 다운로드1
5303궁금하당2/27/20208814C#에서 C++ DLL읽기 (아래 글쓴이) [1]
5302궁금하당2/27/202010904C#에서 C++ DLL호출 ('PInvokeStackImbalance') [4]파일 다운로드1
5301질문합니...2/27/20206381소켓 대량 데이터 디자인 문의 [1]
5300nals...2/27/20207022vs2013에서 BinaryFormatter Serialize 후 vs2015에서 Deserialize시 예외 발생 [3]파일 다운로드1
5298질문2/26/20208397.lic 파일에 대해 질문 있습니다. [9]
5297임한승2/26/20205970vs2013에서 BinaryFormatter Serialize 후 vs2015에서 Deserialize시 예외 발생 건 [1]파일 다운로드1
5295나그네2/25/20207366클라이언트 PC 정보 조회관련.. [2]
5294닷넷초보ㅠ2/25/20207364윈폼으로 socket통신프로그램 만든후 release로 디버깅한 실행파일을 다른컴퓨터에서 실행할때 반응이없어요 [1]
5293탱코2/21/20207264검색을 하고 싶은데 어떻게 검색을 해야 할 지 모르겠습니다. [1]
5292아부리2/19/20207156XingApiNet 관련 질문 [3]
5291지현명2/15/20207904JsonConvert.Serialize 하고 Deserialize 할때 간헐적으로 한글 깨짐 현상 문의 합니다. [3]
5290베도빈2/15/20207244직접 제작한 사용자 정의 콘트롤 DLL, 실행파일에 포함시켜 배포할 수 있을까요? [1]
... 16  17  18  19  20  21  22  23  [24]  25  26  27  28  29  30  ...