C++/CLI Quick Reference - Coding

    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

    스트링 문자열 사용하기

    스트링 문자열 넘기기

    새로운 예약어들

Leave Comments


Category

Recent Comment

Recent Trackback

Tag