none
C# 프로젝트에서 dll 함수 사용 시 char* argument 관련에서 질문 드립니다. RRS feed

  • 질문

  • 안녕하세요 선배님들

    제목과 같이 C 프로젝트로 생성한 dll import 시 함수에 있는 char* argument 처리에 대해서 궁금한게 있어서 글 올렸습니다.

    예를들어서 아래와 같이 선언 후

    ex)

    원본함수 -> int test(int* sockfd, char* pData, int flag)

    [DllImport(@"***.dll")]

    public unsafe static extern int test(int *sockfd, [MarshalAs(UnmanagedType.LPStr)] string pData, int flag);

    위와같이 마샬링을 한 후 argument를 받는 방법이 있어서 적용결과

    처리되지 않은 'System.AccessViolationException' 형식의 예외가

    xxx에서 발생했습니다.

    추가정보 : 보호된 메모리를 일걱나 쓰려고 했습니다. 대부분 이러한 경우는 다른 메모리가 손상되었음을 나타냅니다.

    라는 오류가 발생했습니다.

    빌드 구성관리자로 x64 (64비트) 환경까지 맞춰주었는데,

    무엇이 문제일까요? 조언 부탁드리겠습니다.

    2019년 7월 8일 월요일 오전 7:03

답변

  • 디버깅으로 C 프로젝트의 test 함수 도입부에 BP 걸고 인자들이 정상적으로 넘어왔는지 확인해 보면 금방 답이 나올 것입니다.

    가령, string을 넘겨줬는데 test 함수 측에서 char *pData가 정상적으로 넘어왔는지 확인이 필요합니다.

    일단, 마샬링 구문 자체로는 이상이 없고 test 함수 내부에서 사용한 코드 중에 C# 측에서 넘겨준 데이터를 의도치 않게 사용한 부분이 있을 것입니다.

    • 편집됨 SeongTae JeongMVP 2019년 7월 9일 화요일 오전 12:00
    • 답변으로 표시됨 Mangcho 2019년 7월 9일 화요일 오전 7:45
    2019년 7월 8일 월요일 오후 11:58

모든 응답

  • 디버깅으로 C 프로젝트의 test 함수 도입부에 BP 걸고 인자들이 정상적으로 넘어왔는지 확인해 보면 금방 답이 나올 것입니다.

    가령, string을 넘겨줬는데 test 함수 측에서 char *pData가 정상적으로 넘어왔는지 확인이 필요합니다.

    일단, 마샬링 구문 자체로는 이상이 없고 test 함수 내부에서 사용한 코드 중에 C# 측에서 넘겨준 데이터를 의도치 않게 사용한 부분이 있을 것입니다.

    • 편집됨 SeongTae JeongMVP 2019년 7월 9일 화요일 오전 12:00
    • 답변으로 표시됨 Mangcho 2019년 7월 9일 화요일 오전 7:45
    2019년 7월 8일 월요일 오후 11:58
  • 답변 주셔서 감사합니다 선배님

    말씀해주신대로 마샬링은 전혀 문제가 안되었고,

    test 함수에서 사용하는 pData 자료형이 char가 아니라 byte*로 넘겨줘야 했었네요 ^^

    해결 감사합니다!

    2019년 7월 9일 화요일 오전 7:45