마샬링이 문자열이있는 구조물을 마샬링 할 때 Pinvoke 오류
-
11-07-2019 - |
문제
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); } }
}
제휴하지 않습니다 StackOverflow