문제

C ++ 구조물이 있습니다

struct UnmanagedStruct
{
   char* s;
   // Other members
};

그리고 c# struct

struct ManagedStruct {
   [MarshalAs(UnmanagedType.LPStr)]
   string s;
   // Other members
}

C ++ 라이브러리가 노출됩니다

extern "C" UnmanagedStruct __declspec(dllexport) foo( char* input );

그리고 그것은처럼 수입됩니다

  [DllImport("SomeDLL.dll", CharSet = CharSet.Ansi)]
  static extern ManagedStruct foo( string input );

그러나이 기능을 부를 때 나는 얻는다

마샬 서적 예고는 도달되지 않았다

방법의 유형 서명은 Pinvoke 호환되지 않습니다.

문제는,이 기능 호출이 문자열에서 문자열을 제거하면 작동한다는 것입니다.

도움이 되었습니까?

해결책

이 유형의 시나리오에서는 문자열을 직접 사용하지 마십시오. 대신 유형을 intptr 값으로 전환하고 Marshal.ptrtostringauto/ansi/uni를 적절하게 사용하십시오. 이 경우 기본 코드가 사용하기 때문에 char*, ptrtostringansi가 최선의 선택입니다.

struct ManagedStruct {
  IntPtr s;
  public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top