C#과 C DLL 간 문자열 전달: 최소 예
이 쿼리에서 개발자는 C#과 C DLL 간에 문자열을 전달하는 데 어려움을 겪습니다. DLL. 그들의 코드를 분석하면 그들의 노력을 방해하는 근본적인 문제, 즉 interop 경계에서 C std::string과 C# 문자열 간의 비호환성이 드러납니다.
그들이 정의하는 C DLL 함수:
extern "C" { string concat(string a, string b){ return a + b; } }
C#에서는 직접 액세스할 수 없습니다. 이는 std::strings가 상호 운용성에 적합한 데이터 유형이 아니며 상호 운용성 경계를 넘어 전달되어서는 안 되기 때문입니다.
이 문제를 해결하려면 개발자는 상호 운용성에 적합한 대체 데이터 유형을 사용해야 합니다. 일반적인 접근 방식은 null로 끝나는 문자 배열을 활용하는 것입니다. 이러한 문자 배열은 서로 다른 프로그래밍 언어 간에 쉽게 마샬링될 수 있습니다. C 코드의 수정된 버전은 다음과 같습니다.
extern "C" { void concat(char* str1, char* str2, char** result) { int len1 = strlen(str1); int len2 = strlen(str2); int resultSize = len1 + len2 + 1; //null-terminator included *result = (char*)malloc(resultSize); //allocate memory for the result string strcpy(*result, str1); strcat(*result, str2); //append str2 to str1 } }
이 함수는 3개의 매개변수, 즉 두 개의 입력 문자 배열(str1 및 str2)과 할당되어 반환될 결과 문자 배열(*result)을 사용합니다.
C#에서는 그에 따라 코드를 조정할 수 있습니다.
[DllImport("*****.dll", CallingConvention = CallingConvention.Cdecl)] static extern void concat(string str1, string str2, StringBuilder result); ... StringBuilder result = new StringBuilder(10); concat("a", "b", result); Console.WriteLine(result.ToString());
이 코드는 StringBuilder를 할당합니다. 최대 10자이며 이를 결과 매개변수로 C 함수에 전달합니다. 함수가 실행된 후 연결된 문자열을 StringBuilder에서 사용할 수 있습니다.
이 접근 방식을 활용하면 개발자는 interop 호환 데이터 유형을 사용하여 문자열이 전달되고 반환되도록 보장하여 이전에 발생한 System.AccessViolationException을 해결합니다. .
위 내용은 C#과 C DLL 간에 문자열을 효율적으로 전달하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!