P / Invoke 및 .NET 대상 프레임 워크 [중복]

Jan 22 2021

이 문제는 나를 벽으로 몰아 넣고 있습니다.

우리 회사에는 레거시 C ++ 라이브러리가 있고 .NET 래퍼를 만드는 임무를 받았습니다.
나는 C ++ 또는 P / Invoke에 대한 경험이 없으므로 간단한 방법을 시도하고 있습니다.

공식 문서를 읽었으며 멋진 튜토리얼 도 찾았 습니다 .
그러나 소비 앱의 대상 .NET 프레임 워크가 차이를 만든다는 것을 발견했습니다.
자습서의 P / Invoke 코드는 잘 작동하지만 그가 .NET Framework 4 Client Profile을 대상으로한다는 것을 알게되었습니다 .
중단 점을 배치하면 충돌이 발생하고 모든 것이 예상대로 작동하며 4보다 높은 프레임 워크를 대상으로하면 프로그램이 예외없이 충돌합니다.

C ++로 정의 된 정말 간단한 메서드가 있습니다.
framework.h

extern "C" {
    API char* SayHello();
}

dllmain.cpp

char* SayHello() {
    return (char*)"Hello";
}

C#

        [DllImport("PInvokeTest.dll")]
        public static extern string SayHello();

(다른 조합으로 속성에 CallingConvention 및 CharSet을 설정하려고 시도했지만 한자를 얻을 수 있었지만 Framework 4보다 높게 작동하지 않습니다)

내 C ++ 프로젝트에는 전 API=__declspec(dllexport)처리기 정의가 설정되어 있고 호출 규칙이 있습니다 _stdcall (\Gz)(나는 _cdecl도 시도했습니다).
C # 프로젝트는 Framework 4 에서 잘 작동합니다. 그 이상으로 변경하면 예외없이 종료됩니다. 실제로 존재 하는 것을 보여주는 Dependencies GUI
도 발견 했습니다.SayHello

우리 회사는 4.6.1을 사용 하고 있으며 PInvokeStackImbalance로 이끄는 이 기사 를 보았지만 제 경우에는 아무것도하지 않습니다.

어떤 도움이라도 대단히 감사하겠습니다.
필요한 경우 임시 GitHub 저장소를 만들 수 있습니다.

답변

LukeTO'Brien Jan 22 2021 at 19:50

이제 문자열 문제라는 것을 알았으므로 약간의 검색을 수행 하고이 질문을 찾았습니다 .
그래서 결국 나는 BSTR접근 방식을 사용했습니다 .

BSTR SayHello() {
    return ::SysAllocString(L"Hello");
}
        [DllImport("DBReplicator.Lib.dll")]
        [return: MarshalAs(UnmanagedType.BStr)]
        public static extern string SayHello();

... 그래도 내가 어떻게 한자를 얻을 수 있었는지 모르겠다.