2017-01-09 1 views
0

나는 C++ 프로젝트에서 형성된 너겟이 있습니다. 그 너겟 내에는 다른 프로젝트의 (C#) REST 서비스 호출에서 호출하는 정적 클래스 FileAccess.cs 내부에 GetBytes의 extern 메서드가 있습니다. 일부 데이터를 검색하십시오. 내가이 GetBytesextern 메서드를 내 C# REST 서비스에서 호출 할 때마다 나는 어떤 이유로 AccessViolationException을 얻습니다. 이 메서드는 두 문자열과 여러 int 값을 받아 IntPtr을 반환합니다.AccessViolationException 직접 extern 메서드를 호출 할 때

위반이 발생하지 않는 유사한 호출이 있기 때문에 혼란 스럽습니다. 주요 차이점은이 버전은 extern 메서드를 직접 호출하지 않는다는 것입니다. 대신 extern 메서드를 호출하는 함수가 포함 된 C# DataGroup 클래스 (너겟의 일부)를 호출합니다. DataGroup 클래스 메서드는 byte[,]을 반환하지만 extern 메서드를 호출하고 데이터를 마샬링 한 후에 만 ​​반환됩니다.

는 는

// AccessViolation 결과 버전 : IntPtr (IntPtr ptr = FileAccess.getBytes(...);

  • 통근 방법으로 통근 방법

    1. REST 호출은 IntPtr
    2. AccessViolationException 함께

    // 작업 버전을 발생 반환 추가 수업 :

    1. byte[,]을 반환하는 데이터 그룹 방법으로 REST 호출. (예 dataGroupInstance.getDataGroupBytes();
    2. 통근 방법에있어서 내부 호출 getDataGroupBytes
    3. 은 통근 방법 IntPtr에서 IntPtr
    4. 방법을 getDataGroupBytes 마샬링 데이터를 리턴하고이 에러가

    근본적 이유는

  • 없다 byte[,] 반환 extern 메서드를 직접 호출하여 AccessViolationException?

  • +0

    'FileAccess.getBytes (...);'메소드가 가변 인자를 취하는 경우, PInvoke 서명에'CallingConvention.Cdecl'을 설정해야합니다. – Peter

    답변

    0

    그것을 알아 냈습니다. 문제는 내 매개 변수의 결과였습니다. const char*을 사용할 때 C++ 함수는 std::string을 사용했습니다. 나는 std::string (매개 변수로 사용 된 곳)의 모든 인스턴스를 const char*으로 바꿨고 더 이상 예외를받지 못했습니다.

    관련 문제