C++/CLI Quick Reference - Coding
2011.12.12 01:17 Edit
C++/CLI란 무엇인가?
CLR위에서 돌아가는 프로그램 C# 같은 언어에서 네이티브 코드(C++, C)함수를 사용할 수 있도록 중간 다리 역활을 해주는 것이다.
C++/CLI를 사용하기 위해서는 Visual Studio 2005 이상의 버전이 설치되어 있어야 컴파일러가 C++/CLI 문법을 인식한다.
C++/CLI를 이용하면 C# 의 장점과 C++의 장점을 동시에 취할 수 있다.
단점이 있다면 C++/CLI의 문법을 새로 익혀야 한다는 점이다. 코드가 복잡해 지면 문법이 무지 햇갈린다!!
따라서 이 문서에서는 C++/CLI 의 문법을 간단하게 정리했다.
C++/CLI의 사전 지식####
C++/CLI 의 목적은 관리되지 않은 코드를 관리되는 코드와 엮어주는 것이다.
여기서 관리되지 않은 코드는 C,C++ 코드를 의미한다.
여기서 관리되는 코드는 C# 코드를 의미한다.
이게 무슨 말일까?
예를 들어 struct dataA 구조체가 있다고 하자.
이것은 관리되지 않은 코드이다, 즉 C코드이다.
이 dataA 구조체는 C#에서 참조할 수 없다.
그러면 어떻게 dataA 구조체를 C#에서도 읽고, 쓰게 할 수 있을까?
아래와 같이 관리되는 구조체를 만들어 준다
struct ref wrapDataA
위는 C++/CLI의 문법이다. 위 처럼 c#에서 인지할 수 있는 구조체를 만들어 주는 것이다.
wrapDataA의 구조체 내용을 dataA 구조체와 똑같이 만들어 준다.
c#은 wrapDataA 는 접근할 수 있으므로, 함수를 새로 만들어 dataA의 내용을 wrapDataA에 넣어주는 코드를 짜면되는 것이다.
C++/CLI 프로젝트 만들기
Visual Studio 2005에서 새로 만들기로 cpp파일을 하나 추가하면 된다.
C++ 의 해더 파일 include 하기
그냥 C++코드 처럼 #include <stdio.h> 이렇게 사용한다
C# 기본 클래스 참조하기
using namespace System;
위 처럼 하면 된다. 주의할 점은 dot(.)사이가 ::로 바뀐다는 점이다.
아래는 그것에 대한 예제이다
using namespace System::Runtime::InteropServices;
보시는 바와 같이 System.Runtime 이런식으로 하는게 아니라 :: 를 사용하게 된다.
define 문은 그대로 사용가능 하다
class 만들기
c#에서 접근이 가능한 class를 만드는 방법이다
public ref class _name_
{
}
[참고] 관리될 필요가 없는 클래스(c#에서 접근하지 않아도 되는 클래스)는 예전처럼 그냥 쓰면 된다
구조체 만들기
c#에서 접근 가능한 구조체 만들기 예제
public ref struct _name_{
String^ _var1_;
uchar _var2_;
array<int>^ _var3_; /* 1차원 배열 */
array<int,2>^ _var4_; /* 2차원 배열 */
};
[참고] 관리될 필요가 없는 구조체(c#에서 접근하지 않아도 되는 구조체)는 예전처럼 그냥 쓰면 된다
배열 선언하고 이용하기
관리되는 코드로 배열 선언하는 법은 다음과 같다
int형 1차원 배열
array<int>^ _name_ = gcnew array<int>[_count_];
int형 2차원 배열
array<int,2>^ _name_ = gcnew array<int, 2>(1차원 크기, 2차원 크기);
for(int i = 0; i < 2; i++)
for(int k = 0; k < 32; k++)
_name_[i,k] = ~~~~~~;
c#으로 부터 인자값 받기
int, short 같은 경우는 그냥 받으면 된다.
void func(int a, short b){ }
string 형식 받기
void func(String^ _name_){ }
구조체 받기
void func(testStruct^% _name_){ }
사용법은... _name_->member = 10;
C#에서는 func(ref teststruct); 이렇게 호출해야 한다
구조체 배열 받기
void func(array<testStruct^>^% _name_){ }
이때 C#에서는 func(ref teststructArray); 이렇게 호출해야 한다.
관리되고 있는 배열을 Native Pointer로 활용하기#
관리되고 있는 배열들을 바로 네이티브 코드에 넣을 수 없다. 아래와 같이 pin_ptr를 이용한다.
array<int>^ arr = gcnew array<int>(SIZE);
pin_ptr<int> p = &arr[0]; // pin pointer to first element in arr
int* np = p; // pointer to the first element in arr
native_function(np); // pass pointer to native function
관련 자료 : http://msdn.microsoft.com/en-us/library/1dz8byfh(VS.80).aspx
스트링 문자열 사용하기
스트링 문자열 넘기기
새로운 예약어들
