일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Google App Engine
- 갤럭시탭S8울트라
- 신경회로망
- 패턴인식
- BAM
- Python
- 동아리
- 빅데이터
- 신경망
- 삼성소프트웨어멤버십
- 멤버십
- 삼성전자 소프트웨어멤버십 SSM
- 삼성
- 하이퍼바이저
- Bidirectional Associative Memory
- NarwalFreo
- 물걸레자동세척로봇청소기
- 인공지능
- hopfield network
- 구글 앱 엔진
- 증강현실
- Neural Network
- Friendship
- 파이썬
- 나르왈프레오
- 물걸레로봇청소기추천
- 패턴 인식
- 가상화
- SSM
- 고려대학교
- Today
- Total
정보공간_1
[6기 강북 이보희] C++로 만든 DLL을 C#에서 사용하기 본문
안녕하세요. 강북멤버십 22-1기 이보희입니다.
C++로 만든 dll을 C#에서 사용하는 방법에 대해 알아보겠습니다.
1. C# 프로젝트 작성
1) C# 콘솔 응용 프로그램을 생성합니다.
2) System.Runtime.InteropServices 네임스페이스를 추가해준 뒤 다음과 같은 소스를 작성합니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Program
{
[DllImport("MakeDLL.dll")]
private static extern double Sub(double a, double b);
static void Main(string[] args)
{
double result;
result = Sub(1.0, 3.0);
Console.WriteLine(result);
}
}
}
- [DllImport("MakeDLL.dll")] : 사용할 dll을 명시하는 코드입니다. 실행파일과 같은 위치에 있기 때문에 전체 경로가 아닌 dll의 이름만 써 주었습니다. 실행파일과 다른곳에 dll이 존재할 경우 dll의 전체 경로를 적으면 됩니다.
컴파일 후 실행시키면 정상적으로 작동하는 것을 볼 수 있습니다.
*C#으로 만든 dll은 간단히 참조추가 하는것으로 dll 사용이 가능하지만 C/C++로 만든 dll을 참조할 경우 에러가 발생하게 됩니다.
2. 데이터 타입
dll 안의 함수를 사용하는 방법은 위와 같이 간단합니다. 위의 예시에서는 C#, C++에 동일하게 존재하는 데이터 타입을 사용했지만, C#에 존재하지 않는 포인터 혹은 이외의 데이터 타입을 사용하려면 어떻게 해야 할까요?
이럴 경우 아래의 표를 참조해 사용하시면 됩니다.
WIN32 | 비관리C 데이타타입 | C# |
HANDLE | int | int |
BYTE | unsigned char | byte |
SHORT | short | short |
WORD | unsigned short | ushort |
INT | int | int |
UINT | unsigned int | uint 또는 int |
LONG | long | int |
BOOL | long | int |
DWORD | unsigned long | uint |
ULONG | unsigned long | uint |
CHAR | char | char |
LPSTR | char* | string 또는 StringBuilder |
LPCSTR | const char* | string |
LPWSTR | wchar_t* | string 또는 StringBuilder |
LPCWSTR | const wchar_t* | string |
FLOAT | float | float |
DOUBLE | double | double |
| char * | char[] |
표에 없는 데이터 형식의 경우, 동일한 크기의 데이터 형식과 매칭시켜주면 오류가 나지 않습니다.
3. 포인터
C#은 포인터가 존재하지 않기 때문에 C++에서 포인터를 전달할 경우가 문제가 됩니다.
C++의 모든 포인터는 C#의 IntPtr로 매칭시킬 수 있습니다. 혹은 out, ref 키워드를 사용할 수 있으며 안전하지 않은 코드를 허용함으로써 포인터를 사용할 수 있습니다.
C# - C++의 포인터 대응 관계는 아래의 표를 참조하세요.
C# 용법 | 관리되지 않는 용법 | MSIL 용법 | CLR에서 인식한 실제 MSIL 용법 |
기본 형식 | |||
int arg | int arg | int | [in] int |
out int arg | int *arg | [out] int & | [out] int & |
ref int arg | int *arg | int & | [in, out] int & |
구조체 | |||
MyStruct arg | MyStruct arg | MyStruct | [in] MyStruct |
out MyStruct arg | MyStruct *arg | [out] MyStruct & | [out] MyStruct & |
ref MyStruct arg | MyStruct *arg | MyStruct & | [in, out] MyStruct & |
문자열 | |||
string arg | char *arg | string | [in] string |
out string arg | char **arg | [out] string & | [out] string & |
ref string arg | char **arg | string & | [in, out] string & |
클래스 | |||
MyClass arg | MyClass *arg | MyClass | [in] MyClass |
out MyClass arg | MyClass **arg | [out] MyClass & | [out] MyClass & |
ref MyClass arg | MyClass **arg | MyClass & | [in, out] Myclass & |
4. PInvoke.net
C++ , C#간 마샬링은 주로 C++로 작성된 kernel32.dll 이나 user32.dll을 사용할 때 쓰게 됩니다. 이렇게 자신이 직접 만든 dll이 아닌 범용적으로 사용하는 함수를 사용한다면 아래의 사이트를 추천합니다.
사이트에 접속 후, 검색창에 사용하고자 하는 함수명을 입력하면 결과가 뜨게 됩니다.
원하는 함수를 찾아 클릭하면 해당 함수의 C#, VB.Net 마샬링 코드가 나타납니다. 이 코드를 자신의 프로젝트에 복사해 사용하면 됩니다.
함수 뿐만 아니라 클래스나 구조체도 존재합니다. 이 코드도 그대로 사용하시면 됩니다.
감사합니다.
참고문헌
http://msdn.microsoft.com/ko-kr/magazine/cc164193.aspx
'IT 놀이터 > Elite Member Tech & Talk' 카테고리의 다른 글
[6기 대전 민창기] Control System #6 (0) | 2014.11.25 |
---|---|
[6기 대전 민창기] Control System #5 (0) | 2014.11.25 |
[6기 강북 이보희] C++로 DLL 만들기 (1) | 2014.11.24 |
[6기 전주 황규하] Tizen 플랫폼 개발자 되기 정리 (0) | 2014.11.24 |
[6기 전주 황규하] Gerrit 살펴보기 (1) | 2014.11.24 |