> 백엔드 개발 > C++ > C#과 C DLL 간에 문자열을 효율적으로 전달하는 방법은 무엇입니까?

C#과 C DLL 간에 문자열을 효율적으로 전달하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2025-01-01 01:19:09
원래의
1018명이 탐색했습니다.

How to Efficiently Pass Strings Between C# and a C   DLL?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿