2017-02-11 2 views
1

매개 변수로 문자열 (char *)을 반환하는 네이티브 함수를 사용하면 관리 코드를 통해 char *를 미리 할당 한 후 매개 변수로 전달하는 것이 가장 좋습니다. char *를 네이티브 코드 내부에서 할당 한 다음 C#에서 릴리스 하시겠습니까?기본 코드에서 출력 문자열을 마샬링하는 방법

내가 왜 다른 것을 사용해야하는지 왜 내게 친절하게 설명해 주시겠습니까? 해결책을 선호하는 특별한 이유가있는 경우에만 대답하십시오. 대신에 두 가지 해결책이 괜찮 으면 내 질문도 대답으로 간주 될 수 있습니다.

보너스로 저는 첫 번째 경우 (예 : 마샬 클래스 또는 간단한 새 코드 또는 StringBuilder를 사용하여 C#에서 char * 변수를 할당해야하는 것을 알고 싶습니다. 대신 포인터를 삭제해야하는 경우 대신 두 번째 경우의 네이티브 코드 내부에서 char * 변수를 만듭니다.

+0

원본을 삭제하십시오. 나는 어제 삭제를 위해 실제로 표시했다, 누군가 그것을 복원해야한다! 또한 원래의 답변에는 아무런 대답도없고 하나의 덧글이 없었습니다 – sebas

+0

@Flexo :이 속임수는 삭제되었습니다.이 질문은 다소 "부드럽지만"주제가있는 것처럼 보일 뿐더러 괜찮은 답변입니다. 다시 열어 보시겠습니까? –

답변

2

char*을 C 함수에서 반환하고 호출자가 할당을 해제 할 것을 기대하는 것이 좋습니다. 호출자가이 작업을 수행하지 않거나 (올바르게 또는 전혀) 메모리 누수가 발생할 수 있습니다. 과 같이 구현과

int GetString(char* str, int* len);

: (OpenGL을, 오픈 CL과 다른 라이브러리에 의해 사용되는 내가 본)이를 방지하는 한 가지 일반적인 방법은 프로토 타입을 선언하는 것입니다

int GetString(char* str, int* len) 
{ 
    if (str == NULL) 
    { 
     len = internal_get_string_length(); 
     return 0; // No errors 
    } 
    else 
    { 
     if (len <= internal_get_string_length()) 
      return -1; // not enough space in str 
     char* internal_str = internal_get_string_ptr(); 
     strcpy(str, internal_str); 
     return 0; 
    } 
} 

문서에서는 str이 NULL이면 반환 할 문자열의 길이가 len으로 반환됨을 나타냅니다. 그렇지 않으면 포인터 str에 필요한만큼의 문자가 포함될 것으로 예상됩니다. 이를 사용하기 위해 사용자는 str에 대해 NULL을 사용하고 len에 대해 int로 두 번 함수를 호출 한 다음 len만큼 할당 된 char 배열을 사용하여 함수를 두 번 호출합니다. P/호출을위한 프로토 타입은 다음과 같습니다.

// Declaration 
[DllImport("myDll.dll")] 
int GetString(StringBuilder sb, ref int len); 

// Usage 
int length; 
GetString(null, length); 
var sb = new StringBuilder(length); // Set capacity 
GetString(sb, length); 
Console.WriteLine(sb.ToString()); // Do stuff with C# string 

희망이 있습니다.

+0

조금 어색하지만 적어도 나는 지금 더 나은 이해를 가지고있다. – sebas

관련 문제