본문 바로가기
C++/ISSUE

[C++] Pass value between c# and c++ by memory copy or Mashal, 메모리 카피 또는 Mashal을 이용한 c#과 c++간 변수값 주고받기

by SeoKhan 2022. 6. 28.

C++ DLL을 이용하여 C#에 함수를 import한 경우 c#에서 변수값을 넘겨주고 c++에서의 변경사항 또는 결과값을 넘겨준 변수값에 할당하고 싶은 경우가 있다.

 

그러한 경우 메모리 복사나 Mashal을 통해 해결할 수 있다.

 

<C#>

[DllImport(DLL_NAME, CallingConvention = CallingConvention.Cdecl)]
public static extern (반환형) (함수명) (
	...
    );

다음과 같이 C#에서 DLL의 함수를 import 했을 때,

 

1. 단일 값의 경우

DLL에서 import한 함수의 인자로 int, char, double, bool 같은 자료형을 넣을 경우

<C#>
ref int recogNum

<C++>
int& recogNum

다음과 같이 인자의 형식을 지정해주면, C++에서 변경된 내용을 넘겨받은 C#의 변수에 할당하면 변경이 반영된다.

 

2. 복수 값의 경우

배열이나 string을 넘길 경우는 메모리 카피를 이용해야한다.

<C#>
[In, Out] byte[] decodeResult,
[In, Out] int[] recogX,

<C++>
char* decodeResult,
int* recogX,

인자 값을 다음과 같이 지정해주고, C++에서의 변경사항을 반영하고 싶으면 문자열일 경우에는 strcpy_s, 그 외의 자료형일 경우에는 memcpy_s 함수를 이용한다.

strcpy_s(decodeResult, (문자열 길이) * sizeof(char), (문자열));
memcpy_s(recogX, (배열 사이즈) * sizeof(int), 배열.data(), (배열 사이즈) * sizeof(int));

배열.data() 외에도, &(배열명)[0] 과 같이 써도 된다.

 

이 외에도 C# Mashal이라는 키워드로 검색하면 다양한 방법이 존재한다.