본문 바로가기

C, C++, C#/C#

c++ <-> c# Marshalling 사용법

반응형

목적

C#에서 C++로 구현된 DLL을 이용한다.(개인적인 메모이니 참고하실 분들 참고하세요)

선행사항으로는 C++ DLL이 동일 경로에 있어야함.


포스트의 DLL명은 KJK92.DLL로 정의

 

 

1. Default Marshalling (기본)

1.1. bool, short, int, float, double 형식은 각자 C++, C#의 변수를 맞춰 주면 됩니다.

 

C++ DLL Source

extern "C" __declspec(dllexport) double DLL_Sum(double a, double b)
{
	return a + b;
}

 

C# Source

[DllImport("KJK92.DLL", CallingConvention = CallingConvention.Cdecl)]
extern public static double DLL_Sum(double a, double b);

 


2. String Marshalling (문자열)

2.1. [C# string -> C++ char*]문자열으로 전송합니다. (물론 멀티바이트, 유니코드는 맞추어 줘야합니다.)

C++ DLL Source

extern "C" __declspec(dllexport) void DLL_getString(char* szStrig)
{
	//Do Not	
}

 

C# Source

[DllImport("KJK92.DLL", CallingConvention = CallingConvention.Cdecl)]
extern public static void DLL_getString(string strString);

 

 

 

반응형

3. Struct Marshalling(구조체)

3.1. [C++ Struct -> C# Struct]구조체는 C++, C#에 모두 선언해 주어야합니다.

C++ DLL Source

typedef struct ST_KJK92
{
	double a;
    double d;
}ST_KJK92


extern "C" __declspec(dllexport) double DLL_Sum(ST_KJK92	stKjk92)
{
	return stKjk92.a + stKjk92.b;
}

 

C# Source

[StructLayout(LayoutKind.Sequential)]
public struct ST_KJK92
{
	double a;
    double b;
}



[DllImport("KJK92.DLL", CallingConvention = CallingConvention.Cdecl)]
extern public static double DLL_Sum(ST_KJK92 stKjk92);

 

 


4. Pass by reference Marshalling(참조 파라미터)    

4.1. [C# ref -> C++ &] 참조 변수를 전달하여 값을 받아옵니다.

 

C++ DLL Source

extern "C" __declspec(dllexport) void DLL_Sum(double a, double b, double& c)
{
	c = a + b;
}

 

C# Source

[DllImport("KJK92.DLL", CallingConvention = CallingConvention.Cdecl)]
extern public static void DLL_Sum(double a, double b, ref double c);

 

5. Array Marshalling(배열)      

5.1. [ C# Array -> C++ * ] C++ 배열을 전달합니다. 

 

C++ DLL Source

extern "C" __declspec(dllexport) void DLL_Array(int nDataCnt, double *pData)
{
	for(int a= 0; a < nDataCnt; a++)
    {
    	//! Use "pData[a]"
    }
}

 

C# Source

[DllImport("KJK92.DLL", CallingConvention = CallingConvention.Cdecl)]
extern public static void DLL_Array(int nDataCnt, double[] adData);

 

 

반응형