DllImport를 사용하여 자체 .net 클래스에서 C 랩퍼 라이브러리의 메소드를 호출합니다. 이 메서드는 C DLL을 문자열 변수를 만들고 문자열 포인터를 반환합니다.여유 메모리가 메모리 블록을 지우지 않음
이와 비슷한 것;
_declspec(dllexport) int ReturnString()
{
char* retval = (char *) malloc(125);
strcat(retval, "SOMETEXT");
strcat(retval, "SOMETEXT MORE");
return (int)retval;
}
그럼 난 Marshall.PtrToStringAnsi (PTR)를 사용하여 문자열을 읽었다. 문자열의 복사본을 얻은 후에는 free (ptr)를 호출하는 C 래퍼 라이브러리에있는 다른 c 메서드 HeapDestroy를 호출합니다.
여기에 질문이 있습니다. 최근에는 매력처럼 작동하면서 "보호 된 메모리 영역을 읽거나 쓰려고했습니다."라는 예외가 생기기 시작했습니다. 더 깊은 분석 후, 나는이 포인터에 대해 무료 메서드를 호출했지만 포인터의 값이 지워지지 않고 무의식적으로 힙을 채우고이 예외를 throw하도록 iis 작업자 프로세스를 만듭니다. 그건 그렇고, 그것은 C 라이브러리 에서이 방법을 호출 웹 사이트 프로젝트입니다.
이 문제에 대해 저에게 친절히 도와 주시겠습니까?
물론 여기 C# 코드가 있습니다.
[DllImport("MyCWrapper.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private extern static int ReturnString();
[DllImport("MyCWrapper.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private extern static void HeapDestroy(int ptr);
public static string GetString()
{
try
{
int i = ReturnString();
string result = String.Empty;
if (i > 0)
{
IntPtr ptr = new IntPtr(i);
result = Marshal.PtrToStringAnsi(ptr);
HeapDestroy(i);
}
return result;
}
catch (Exception e)
{
return String.Empty;
}
}
사용중인 C# 코드를 게시 하시겠습니까? –
C# 코드를 추가했습니다. 감사합니다 –