char 버퍼를 관리되지 않는 함수에 전달해야하는 C# 프로그램이 있습니다. 안정적으로 작동하는 것으로 보이는 두 가지 방법을 찾았지만 어느 것을 선택해야할지 모르겠습니다.C#에서 관리되지 않는 함수 호출 : StringBuilder를 전달해야합니까? 아니면 안전하지 않은 코드를 사용해야합니까?
다음은 관리되지 않는 함수의 서명입니다.
extern "C" __declspec(dllexport) int getNextResponse(char *buffer);
첫 번째 옵션은 다음과 같이 버퍼를 StringBuilder로 정의하는 것입니다.
//at class level...
[DllImport("mydll.dll")]
static extern int getNextResponse(StringBuilder buffer);
//in main method body...
StringBuilder sb = new StringBuilder(" ", 65536);
int rc = getNextResponse(sb);
이 간단하고, 상호 운용성 층 그냥 문자로 모두 StringBuilder를 정렬 화되어 그것을 작동, 나는 모두 StringBuilder가 무대 뒤에서 버퍼를 가지고 있기 때문에 그것이 작동하는 이유는 기본적으로 이해 생각, 그래서 (나는 가정) *.
다른 옵션은 안전하지 않은 코드를 사용하고 있습니다.
//at class level...
[DllImport("mydll.dll")]
static extern int getNextResponse(byte* buffer);
//separate method...
private static unsafe int runGetNextResponse(byte[] buffer)
{
fixed (byte* p = buffer)
{
int rc = getNextResponse(p);
return rc;
}
}
//in main method body...
byte[] b = new byte[65536];
int rc = runGetNextResponse(b);
두 번째 방법은 코드가 더 많지만 진행 상황에 대해서도 더 분명합니다.
기본적으로 동일한 두 가지 방법이 있습니까? 하나를 선택할 이유가 있습니까?
가비지 콜렉터가 getNextResponse 실행 중에 고정 명령문없이 전달 된 StringBuilder를 재 할당하면 어떻게됩니까? 가져온 함수에서 사용되는 모든 포인터 매개 변수는 고정되어야합니까? 또는 나는 seomthing을 놓치고 있냐? – Luca