나는 C# 어셈블리에있는 일부 정적 메서드에 대해 관리되지 않는 래퍼를 제공하는 간단한 관리되는 C++ 어셈블리를 가지고 있습니다. 이 메소드 중 하나는 C++ 어셈블리에서 "const char *"유형으로 변환 한 문자열을 반환합니다. 내가 가진 문제는 관리되지 않는 소스에서이 DLL을로드 할 때 포인터에 잘못된 데이터가 다시 발생한다는 것입니다. 이것에 대해 내가 뭘 할 수 있니? 나는이 아래로 내 테스트 케이스를 단순화 :clr 어셈블리에서 char * 배열을 반환하는 방법은 무엇입니까?
이 이관리되는 어셈블리 (Test.dll에/CLR을 컴파일, 전체 코드는 다음) :
이extern "C" {
__declspec(dllexport) const char* GetValue(const char* s) {
return s;
}
}
관리되지 않는 콘솔에서 Win32 응용 프로그램 :
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
typedef const char* (*GetValueFunc)(const char* s);
int _tmain(int argc, _TCHAR* argv[]) {
wprintf(L"Hello from unmanaged code\n");
HMODULE hDll = LoadLibrary(L"Test.dll");
if (!hDll)
return GetLastError();
wprintf(L"library found and loaded\n");
GetValueFunc getValue = (GetValueFunc)GetProcAddress(hDll, "GetValue");
if(!getValue)
return GetLastError();
wprintf(L"%s\n", getValue("asdf"));
return 0;
}
내가 얻을 첫 번째 두 라인은 괜찮지 만 나오는 세 번째 라인은 쓰레기입니다. 또한 dll에 cpp 파일의 맨 위에 "#pragma unmanaged"를 지정했는지 여부는 중요하지 않습니다 (동일한 결과). 당신이 그것을에 "CONST의 char *"를 전달하는 동안 % s 형식 지정자와
그래, 유니 코드 인 것처럼 8 비트 문자열을 인쇄하고 있습니다. 그것은 중국어를 생산합니다. wprintf() 대신 printf()를 사용하는 것은 간단한 해결책입니다. % s 대신 % hs를 사용하는 것은 또 다른 저렴한 트릭입니다. –