반응형
목적
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);
반응형