블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2106)
Unity3D (470)
Programming (453)
Unreal (2)
Gamebryo (56)
Tip & Tech (162)
협업 (26)
3DS Max (3)
Game (12)
Utility (101)
Etc (88)
Link (29)
Portfolio (18)
Subject (90)
iPhone (30)
Android (2)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (1)
Memories (16)
Interest (36)
Thinking (34)
한글 (23)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (16)
Exercise (3)
나만의 맛집 (2)
냥이 (7)
육아 (2)
Total1,099,602
Today111
Yesterday326
Statistics Graph

달력

« » 2017.10
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        

공지사항

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

public ref class MySingleton sealed
{
public:
	static MySingleton (void);
private: MySingleton (void);
public: static property MySingleton ^ mySingleton
{ MySingleton ^ get()
{ return m_mySingleton;
} } private: static MySingleton ^ m_mySingleton;
};

출처 : mine


ref class MyClass {
    // If you use a getter for 'instance' you can avoid 'initonly' keyword
    static MyClass^ instance = gcnew MyClass();

public:
    ...

    static property MyClass^ Instance
    {
        MyClass^ get()
        {
            return instance;
        }
    }
    ...
};

출처 : http://www.ureader.com/msg/14523461.aspx




저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by blueasa

댓글을 달아 주세요

※ C#에서 호출시 C++/CLI 에서 리턴값, 파라미터값은 다음과 같이 처리합니다.

 

 [ String - BSTR (LPCTSTR) ]

// ex: Set

bool SetTestString(String^ strTestString)
{
   axTestCtrl1->TestString= strTestString;
   return true;

}

// ex: Get
String^ GetTestString()
{
   return axTestCtrl1->TestString;
}

short, int, long ]

 

: short, int, long 형은 그냥 주고 받으면 됩니다.

// ex: Set

bool SetShortVal(short nShortVal)
{
   axTestCtrl1->ShortVar = nShortVal;
   return true;
}

// ex: Get
short GetShortVal()
{
   return axTestCtrl1->ShortVal;
}

struct ]

// ex: 참조 가능한 구조체 선언

ref struct EocsTestStruct
{
   String^ eocsstrVal;
   short eocsnVal;
   long eocslnVal;
}

 

// ex: 구조체를 파라미터로 받아서 Set

bool SetEocsTestStruct(EocsTestStruct^% EocsTest)

{

   try

  {
      axTestCtrl1->ShortVar = nShortVal;

      axTestCtrl1->eocsstrVal= EocsTest->eocsstrVal;

      axTestCtrl1->eocsnVal= EocsTest->eocsnVal;
      axTestCtrl1->eocslnVal= EocsTest->eocslnVal;
      return true;

   }

   catch (Exception^ e) 
   {
       MessageBox::Show(e->Message);
       return false;
   }
}

...

... ING ... : 다른 케이스도 작업하다가 정리할 예정입니다.

...

저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by blueasa

댓글을 달아 주세요

gcnew로 생성하지 않기

 

C++/CLI는 클래스를 생성할 때 ‘gcnew’를 사용하지 않고 생성할 수도 있습니다.

 

리스트 1. ‘gcnew’를 사용하지 않고 클래스 생성하기 >

#include "stdafx.h"

#include <stdio.h>

 

using namespace System;

 

ref class ManagedTest

{

public:

           ManagedTest() { Console::WriteLine(L"New ManagedTest"); }

           ~ManagedTest() { Console::WriteLine(L"delete ManagedTest"); }

          

           void func() { Console::WriteLine(L"Call func() - {0}", nNumber ); }

 

           int nNumber;

};

 

void foo1()

{

           ManagedTest MTest;

           MTest.nNumber = 1;

           MTest.func();

}

 

void foo2()

{

           ManagedTest^ MTest = gcnew ManagedTest();

           MTest->nNumber = 2;

           MTest->func();

}

 

int main(array<System::String ^> ^args)

{

           foo1();

           foo2();

          

           getchar();

           return 0;

}


결과 >


<리스트 1> ManagedTest MTest; 는 비 관리 C++처럼 GC가 아닌 스택 영역에 생성하는 것으로 착각할 수도 있겠지만 전혀 아닙니다클래스를 생성하면 언제나 GC 영역에 만들어집니다

위의 코드는 그냥 ‘gcnew’ 사용을 우리가 생략하고 컴파일러가 대신 써 준다고 생각하시면 됩니다.

 

void foo1()

{

           ManagedTest MTest;

           MTest.nNumber = 1;

           MTest.func();

}

은 컴파일러에 의해서 아래의 코드로 바뀝니다.

void foo1()

{

           ManagedTest^ MTest = gcnew ManagedTest();

           MTest->nNumber = 1;

           MTest->func();

           delete MTest;

}

 

위의 코드를 보시면 아시듯이 gcnew를 사용하지 않고 클래스를 생성하면 우리가 직접 delete를 쓰지 않아도 되는 편리함을 얻을 수 있습니다.

gcnew를 사용하지 않는 것은 C#에서 ‘using’을 간략화 시킨 것으로 생각하면 좋습니다.


< C# using 문 사용 예 >

using (Graphics g = this.CreateGraphics())

{

    g.DrawLine(Pens.Black, new Point(0,0), new Point(3,5));

}

 

 

 

 

value 클래스

 

관리 클래스는 복사 생성자와 대입 연사자를 가지지 못하므로 아래의 코드는 컴파일 에러가 발생합니다.

 

리스트 2. >

#include "stdafx.h"

#include <stdio.h>

 

using namespace System;

 

ref class C {

    int i;

};


void func(C c) {}


int main()

{

    C c;

    C d;

    func(c);   // 에러

    d = c;     // 에러

}

 

그러나 클래스를  ‘ref’가 아닌 ‘value’ 클래스로 정의하면 위의 코드는 컴파일 할 수 있습니다.

 

#include "stdafx.h"

#include <stdio.h>

 

using namespace System;

 

value class C {

    int i;

};

void func(C c) {}

int main()

{

    C c;

    C d;

    func(c);   // 에러

    d = c;     // 에러

}

 

value 클래스는 클래스간 복사를 할 수 있는 능력이 있습니다이 복사는 비트 단위의 복사로 이른바 ‘memcpy’와 같은 복사입니다.

value 클래스는 복사를 할 수 있으므로 value 클래스의 멤버는 절대 복사 가능한 멤버만 가질 수 있습니다그래서 아래와 같은 value 클래스 C는 컴파일 에러가 발생합니다.

 

ref class A

{

  int i;

};

 

value class C

{

  A a;

};

 

 

 value 클래스의 특징으로는 ref 클래스가 GC에서 만들어지는 것과 달리 스택에 만들 수 있습니다.

value class C

{

};

 

C c;

 

위 코드에서 클래스는 스택에 만들어집니다(물론 gcnew를 사용하면 GC에 만들어집니다)

 

value 클래스의 특징은 좀 더 있는데 위에 설명한 것들과 포함해서 아래와 같이 정리할 수 있습니다.

 


value 클래스의 특징

 

1. 기본 생성자를 가질 수 없다.

2. 복사 생성자를 가질 수 없다.

3. 대입 연산자를 가질 수 없다.

4. 소멸자를 가질 수 없다.

5. finalize를 가질 수 없다.

6. 클래스간 복사를 할 수 있다.

7. 복사 불가능한 것을 멤버로 가질 수 없다(ref 클래스 등).

8. 스택에 생성할 수 있다.

9. 다른 클래스를 계승할 수 없다( interface는 가능하다)

 

 

 


관리 클래스를 파라메터로 넘기기

 

ref class A

{

           int i;

};

 

void foo1( A a )

{

}

 

함수 foo1의 파라미터 정의는 클래스 A value 클래스일 때만 사용할 수 있습니다그러므로 아래와 같이 foo1의 파라미터를 정의해야 합니다.

void foo1( A^ a )

{

}

 

 

 

 

그 외….

 

C++/CLI에서 참조는 ‘%’을 사용합니다이것은 비 관리의 ‘&’와 구별이 됩니다.

%는 아래와 같은 경우에 유용하게 사용할 수 있습니다.

void foo( A^ a )

{

}

 

A a;

// foo( a );  // 에러

foo( %a ); // 성공


참조는 C#에서는 'ref', VB.NET에서는 'ByRef'와 같다고 생각하시면 됩니다.


// 값을 참조로 넘기는 경우

void valuebyref(int%i)
{
   i=5;
}

// 참조형을 참조로 넘기기
void refbyref(String^%s)
{
   s="newstring";
}

void main()
{
   int i=1;

   valuebyref(i);

   String^s="basestring";
   refbyref(s);
}
( 위 코드는 http://adversaria-june.blogspot.com/2006/08/ccli_26.html 에서 인용했습니다 )

 



구조체는 관리나 비 관리나 다른 점은 없습니다.


 

참조와 구조체는 너무 짧게 끝나버렸네요^^;


출처 : http://vsts2010.net/323

http://vsts2010.net/323

저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by blueasa

댓글을 달아 주세요

C C++의 큰 차이점의 하나가 바로 C++에만 있는 클래스입니다또 클래스는 객체 지향 프로그래밍 언어에서 자주 볼 수 있습니다.

 

C++/CLI에서 관리 클래스는 ‘ref’라는 키워드를 사용하여 만듭니다.

 

비 관리 클래스

class Test

{

};

 

관리 클래스

ref class Test

{

};

 

관리 클래스는 ‘ref’를 제외하고는 외관상으로는 비 관리 클래스와 비슷하지만 관리와 비 관리가 많이 다르듯이 관리 클래스는 비 관리 클래스와 다른점이 있습니다. 그러므로 이것을 잘 파악하고 있어야 합니다.

 

 

 

관리 클래스의 특징

 

1. 정적 할당은 안 된다무조건 가비지컬렉션(GC)에 동적으로 생성한다.

 

2. 복사 생성자를 만들 수 없다.

 

3. ‘^’(핸들이라고 부른다)과 ‘gcnew’를 사용하여 클래스를 생성한다당근 메모리 해제는 GC에서 관리한다.

 

4. 핸들은 네이티브의 ‘*’(포인터나 ‘&’(참조)와 비슷한 것으로 더 안정스럽다.

 

5. ‘delete’는 명시적으로 클래스에서 사용하고 있는 리소스를 해제할 때 사용하는 것으로 소멸자가 호출 되는 것이지 메모리에서 해제하는 것은 아니다 delete GC에 있는 메모리를 해제하는 것은 아니다.

 

6. delete로 소멸자를 호출하면 GC에 의해서 진짜 파괴될 때 소멸자는 호출되지 않는다.

(소멸자를 선언한 클래스는 자동적으로 IDisposable 인터페이스를 구현한다소멸자는 컴파일러에 의해서Dispose() 메소드로 치환된다).

 

7. 소멸자 이외에 'finalize'를 선언할 수 있다. finalize GC에서 인스턴스가 파괴될 때 호출된다 delete로 소멸자를 호출한 경우에는 finalize는 호출되지 않는다.

 

8. finalize는 ‘!’ 키워드를 사용한다.

 

 

 

관리 클래스 사용해 보기

 

코드 1. 관리 클래스 정의 및 사용 >

#include "stdafx.h"

 

using namespace System;

 

ref class ManagedTest

{

public:

           ManagedTest() { Console::WriteLine(L"New ManagedTest"); }

           ~ManagedTest() { Console::WriteLine(L"delete ManagedTest"); }

           !ManagedTest() { Console::WriteLine(L"finalize ManagedTest"); }

};

 

int main(array<System::String ^> ^args)

{

           Console::WriteLine(L"1.");

          ManagedTest^ MTest1 = gcnew ManagedTest();

           delete MTest1;

 

           Console::WriteLine(L"2.");

           ManagedTest^ MTest2 = gcnew ManagedTest();

          

           return 0;

}

 

결과 >





<코드 1> 설명



그림 1. <코드 1>의 소스 코드와 결과 >

 

<그림 1> 코드를 보면 3번의 ‘gcnew’, 4번의 ‘^’를 사용하여 ManagedTest를 생성하였습니다

<코드 1>에는 없지만 핸들은 포인터와 같은 것으로 관리 클래스의 멤버를 사용할 때는 ‘->’를 사용합니다.

5 delete를 사용하면 소멸자가 호출되어서 6번이 출력됩니다.

MTest2는 소멸자를 호출하지 않아서 8번에서 정의한 finalize가 프로그램이 종료할 때 호출됩니다(7).


 

<코드 1>은 아주 짧고 단순한 코드이지만 관리 클래스의 대부분의 특징을 다 나타내고 있습니다관리 클래스에 대한 설명은 아직 남아 있습니다이것은 다음 회에 또 설명하겠습니다.


출처 : http://vsts2010.net/314

cnf

저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by blueasa

댓글을 달아 주세요


저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by blueasa
TAG C++/CLI

댓글을 달아 주세요

There is certainly a lot more to be said about C++/CLI, never mind the Visual C++ 2005 compiler, but I hope this article has provided you with a good introduction to what it has to offer for programmers targeting the CLR. The new language design provides unprecedented power and elegance to write rich .NET applications completely in C++ without sacrificing productivity, conciseness, or performance.

The following table provides a summary of the most common constructs for quick reference.

Description C++/CLI C#
Allocate reference type ReferenceType^ h = gcnew ReferenceType; ReferenceType h = new ReferenceType();
Allocate value type ValueType v(3, 4); ValueType v = new ValueType(3, 4);
Reference type, stack semantics ReferenceType h; N/A
Calling Dispose method ReferenceType^ h = gcnew ReferenceType;

delete h;

ReferenceType h = new ReferenceType();

((IDisposable)h).Dispose();

Implementing Dispose method ~TypeName() {} void IDisposable.Dispose() {}
Implementing Finalize method !TypeName() {} ~TypeName() {}
Boxing int^ h = 123; object h = 123;
Unboxing int^ hi = 123;

int c = *hi;

object h = 123;

int i = (int) h;

Reference type definition ref class ReferenceType {};

ref struct ReferenceType {};

class ReferenceType {}
Value type definition value class ValueType {};

value struct ValueType {};

struct ValueType {}
Using properties h.Prop = 123;

int v = h.Prop;

h.Prop = 123;

int v = h.Prop;

Property definition property String^ Name
{
    String^ get()
    {
        return m_value;
    }
    void set(String^ value)
    {
        m_value = value;
    }
}
string Name
{
    get
    {
        return m_name;
    }
    set
    {
        m_name = value;
    }
}

 

About the author

Kenny Kerr spends most of his time designing and building distributed applications for the Microsoft Windows platform. He also has a particular passion for C++ and security programming. Reach Kenny at http://weblogs.asp.net/kennykerr/ or visit his Web site: http://www.kennyandkarin.com/Kenny/.

[출처] C++/CLI article in MSDN|작성자 MON

저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by blueasa
TAG C++/CLI

댓글을 달아 주세요


[MSDN] ms-help://MS.MSDNQTR.v80.ko/MS.MSDN.v80/MS.VisualStudio.v80.ko/dv_vccore/html/5f710bf1-88ae-4c4e-8326-b3f0b7c4c68a.htm
저작자 표시 비영리 동일 조건 변경 허락
신고

'Programming > C++/CLI' 카테고리의 다른 글

C + + 프로그래머를위한 C + + / CLI 소개  (0) 2010.10.05
C++/CLI article in MSDN  (0) 2010.10.02
C++ Interop 사용(암시적 PInvoke)  (0) 2010.09.14
C++/CLI에 대해서 알아두어야 할 것들  (0) 2010.09.13
C++/CLI Type  (2) 2010.09.13
Win32 API TYPE <-> C# TYPE  (0) 2010.07.20
Posted by blueasa

댓글을 달아 주세요


이 글을 이해하기 위해서는…

C++/CLI에 대한 기본적인 이해가 필요합니다.

C++/CLI는 unmanaged code와 managed code의 경계를 허물어 준다.

그렇기 때문에 unmanaged code 영역에서 사용하는 C++의 특성과 managed C++가 갖는 C++의 특성을 모두 가지고 있다. 하지만, 이 두가지 특성이 모두 managed code에 반영되는 것은 아니다.

C++/CLI로 클래스 라이브러리를 작성한다면 다음과 같은 사실을 감안하여 코드를 작성하는 것이 좋다.

네이티브 타입은 더 이상 공짜가 아니다

2005 부터 네이티브 타입은 private 한정자가 적용된다. 소스 수준에서 한정자를 변경하거나 컴파일 지시어 make_public 으로 한정자를 public 으로 변경해야 한다.

템플릿은 생성되지 않는다

템플릿 클래스, 템플릿 메소드 등은 타입에서 제외된다. 매니지드 클래스라 하더라도 템플릿으로 구현된 메소드는 클래스의 메소드에서 제거된다.

템플릿 클래스 타입을 만들고자 한다면 제너릭 클래스 타입을 정의해야 한다.

typedef는 타입이 아니다

C++에서 typedef는 새로운 타입을 생성하는 것이 맞다. 하지만, C++/CLI에서 생성하는 닷넷 클래스 라이브러리에서 typedef는 새로운 타입으로 노출되지 않는다.

하지만, C++/CLI에서 특정 타입의 포인터 타입에 대한 Type 클래스를 얻고자 한다면, typedef로 포인터 타입을 정의해야 한다.

네이티브 타입은 값 타입이다

네이티브 타입은 값 형식으로 정의된다.

새로운 네이티브 타입을 정의하지 말아라

새로 정의한 네이티브 타입을 다른 모듈에서 참조할 때는 여전히 헤더 파일과 라이브러리를 필요로 한다. 당연한 얘기지만, C++/CLI의 닷넷 클래스 라이브러리는 managed C++이 아닌 링커를 위한 라이브러리를 생성하지 않는다.

새로운 네이티브 타입은 오직 닷넷 클래스 라이브러리 내부에서 사용할 용도로만 정의해야 한다.

어셈블리에는 AssemblyInfo 속성이 필요하다

어셈블리는 AssemblyInfo 속성을 포함해야 한다.

그러나, 어셈블리에서 AssemblyInfo 속성 값들을 정의하지 않아도 빌드 에러가 발생하지 않으며, 심지어 오브젝트 뷰어에서 라이브러리로 구현한 클래스들을 확인할 수 있고, C#에서 클래스 라이브러리를 사용하는데 문제가 발생하지 않는다.

하지만, C++/CLI의 managed code에서 이 라이브러리를 사용하고자 할 때, 타입들이 정의되지 않았음을 알게될 것이다. 어셈블리의 AssemblyInfo 속성을 빼먹으면 그렇게 된다.

필요한 모든 클래스를 정의해라

C++/CLI로 닷넷 클래스 라이브러리를 작성하는 경우 기존에 작성해 둔 수 많은 클래스를 다시 정의해야 하는지 고민할 수 밖에 없다.

하지만, 잊어라. 네이티브 클래스는 닷넷의 세계에서 존재하지 않는다. 닷넷 기반으로 필요한 모든 클래스는 새로 정의해야 한다. 다만, 새로 정의하는 클래스에서 이미 구현되어 있는 메소드들을 호출할 수 있도록 C++/CLI가 많은 도움을 준다.

그러나, C++/CLI의 역할은 managed code에서 unmanaged code로의 호출을 지원하고 두가지 타입의 코드가 공존하는 어셈블리를 생성하기 위함에 있다. 기존에 구현되어 있는 클래스를 재사용하기 위한 도구가 아니다.

수많은 C++/CLI 예제에서 괜히 매니지드 클래스를 위한 래퍼 클래스를 일일이 만드는 것이 아니다.


출처 : http://stratosphere631.com/wp/?p=866

저작자 표시 비영리 동일 조건 변경 허락
신고

'Programming > C++/CLI' 카테고리의 다른 글

C++/CLI article in MSDN  (0) 2010.10.02
C++ Interop 사용(암시적 PInvoke)  (0) 2010.09.14
C++/CLI에 대해서 알아두어야 할 것들  (0) 2010.09.13
C++/CLI Type  (2) 2010.09.13
Win32 API TYPE <-> C# TYPE  (0) 2010.07.20
C#, Managed C++ 참고 자료  (0) 2010.06.25
Posted by blueasa
TAG C++/CLI

댓글을 달아 주세요

C++/CLI Type

Programming/C++/CLI / 2010.09.13 17:43

■ C++/CLI Data Type

C++/CLI 는 3가지 데이터 타입을 가지고 있다.

    - Refercence Type
    - Value Type
    - Native Type



Native Type
C++ 이 가지고 있는 타입으로써 int, float, class, struct, 등이 있다.
타입 인스턴스의 메모리는 스택에 할당된다.
new 연산자로 동적 메모리 생성 하면 힙에 할당 된며, 메모리 해제는 프로그래머의 책임이다.

Value Type & Reference Type
Managed 환경의 Data Type 으로 모두 System::Object 클래스로 부터 상속받아 구현된다.
System::Object 가 외부로 노출시킨 메소드는 다음과 같다.

 Method Name  Return Value  Accssibility
 Equals  bool  public
 GetType  Type  public
 ToString  System::String^  public
 GetHashCode  int  public
 Finalize  -  protected
 MembewiseClone  System::Object^  protected
 ReferenceEquals  bool  public static


Value Type 은 System::ValueType 으로 부터 상속 받는다. System::ValueType 은 System::Object 를 상속 받는다. Value Type 은 메모리를 항상 스택에 할당한다. 모든 Primitive Data Type 과 Struct 들은 Value Type 이다.





■ Primitive Types Mapping

 Data Type Name  Type C++/CLI Keyword
 16bit Integer  System::Int16  short
 32bit Integer  System::Int32  int
 64bit Integer  System::Int64  __int64, long long
 Double  System::Double  double
 Character [2 bytes]  System::Char  char
 Character [1 byte]  System.Byte  byte
 Boolean  System.Boolean  bool

※ 이 밖에도 많은 타입이 정의되어 있다.
※ Primitive Type 은 Value Type 으로서 Stack 에 메모리 할당 된다.
※ Native Code 와 C++/CLI 간의 Primitive Type 값 변환은 별도의 조작없이 바로 해주면 된다.

Primitive Type 의 선언과 사용 예





C++/CLI 에서 Primitive Data Type 은 Value Type 으로서 .NET 의 Primitive Data Type 을 사용하는 방법과 동일하다.





■ Class & Struct

 Native Data Type  Managed Data Type
 class  ref class
 struct  value struct
 enum  enum class
 std::string  String^
 std::map  Dictionary^
 std::vector  List^
 std::list  List^
 function pointer  delegate


C++/CLI 에서 클래스는 Reference Type (.NET Framework 에서 클래스는 Reference Type 이므로 당연한 소리)  이다. Reference Type 의 인스턴스는 결코 스택에 할당되지 않는다. Reference Type 의 인스턴스는 힙에 할당된다. 그러나 이 힙은 Managed Heap 이라 불리며 Native type 이 사용하는 힙과는 다르다. "new" 키워드는 Native Heap 에 메모리를 할당하며, "gcnew" 는 Managed Heap 에 메모리를 할당한다. gcnew 를 사용하여 선언하는 방법은 다음과 같다.



위 방법은 C++/CLI 에서 Managed 객체를 생성하는 방법이다. Managed Heap 에 생성된 인스턴스에 접근하기 위해서는 "객체 참조 (Object Reference)" 또는 "Handle" 이라 불리는 것(위의 코드에서 objRef)을 통하여 접근 가능한데 이들은 스택에 할당된다. 객체 참조를 통하지 않고서는 인스턴스에 접근할 수 없다. 본질적으로 객체 참조는 주소를 물고 있다. 하지만 Native Code 의 포인터와는 같지 않다. 객체 참조는 포인터와 다르게 포인터 연산을 할 수 없다. Managed Heap 에 인스턴스는 하나 이상의 Reference 를 갖는다. 따라서 다른 객체로 객체 참조 shallow copy 가 가능하다. 
 .NET Framework 의 CLR 은 매우 영리하며, Garbage Collection 이 있기 때문에 프로그래머가 메모리 해제에 대해서 걱정할 필요가 없다. 하지만 Database open 과 같이 사용자가 할당한 메모리에 대해서는 사용자가 책임지고 메모리 해제 작업을 해주어야 한다.  다음은 C++/CLI 의 클래스 예 이다.



※ ref class
ref class 로 선언하게 되면 Managed Code 가 되어 가비지 컬렉터의 관리를 받게 된다.
ref class 로 선언되지 않은 클래스는 가비지 컬렉터의 관리를 받지 않으며 Unmanaged Code 이다. 따라서 일반 클래스로 동적 메모리 생성을 하였다면 직접 메모리를 해제시켜 주어야 한다.


※ ref class 작성 예



※ Destructor (소멸자)
일반적인 클래스와 마찬가지로 ref class 역시 소멸자가 존재한다. 또한 사용하는 방법 역시 똑같다. 하지만 ref class 의 소멸자는 IDisposable 인터페이스를 구현한 후에 컴파일러가 소멸자의 호출을 Dispose() 호출로 번역한다. 또한 finalizer 호출이 있는데 이는 Gabage Collector 에 의해 호출되며 "!MyClass()" 와 같이 정의된다. finalizer 는 소멸자가 호출되었는지 확인한 다음에 호출되지 않았다면 소멸자를 호출시켜준다.





■ Declaring and Consuming a Managed Class

1. 전형적인 방법


위 코드에서 caret [^] 는 변수 sysDir 이 Reference 인스턴스를 가리키고 있는 객체 참조 임을 나타낸다. 객체 참조를 통하여 클래스의 public 메소드를 호출할 수 있고, 또다른 객체 참조로 복사할 수 있다. ^ 으로 선언한 객체 참조는 gcnew 키워드를 통하여 Managed Heap 에 메모리 할당 되며 이 메모리는 Garbage Collector 의 관리를 받는다.


2. shallow copy


Managed Heap 에 생성된 Reference 참조를 sysDir 객체 참조가 가리키고 있는데, sysDir2 역시 같은 곳을 가리키게 하는 방법이다.


3. Invoke method


객체 참조 sysDir 을 이용하여 public 메소드를 호출(Invoke) 하는 방법이다.


4. 객체 참조의 매개변수로의 전달


 메소드의 매개변수로 객체 참조가 전달 되었다. 이 메소드 안에서 똑같은 객체에 대해서 작업할 수 있다. 객체 참조가 전달 될 때 복사 생성자는 호출되지 않는다. 즉, 객체의 복사본은 생성되지 않는다. 이것은 C++ 의 포인터를 넘겨 주는 방법과 비슷하다. 만약 복사본을 생성해야 한다면 당신이 작성한 클래스는 System::IClonalbe 인터페이스를 상속 받아야 하고, Clone() 메소드를 구현해야 한다.


5. 객체 참조의 리턴


위의 코드결과 Directory 객체가 생성된다. 할당된 인스턴스를 가리키고 있는 객체 참조가 리턴된다. 리턴된 후에 dirObj 는 Managed Heap 에 있는 객체를 더이상 가리키지 않는다. 리턴되는 객체 참조를 할당 받고, 그것을 보존하는 것은 메소드를 호출하는 쪽의 책임이다.





■ Abstract Class

클래스에 abstract 키워드를 붙이면 Managed Class 를 추상 클래스로 만든다. 이 방법은 추상 메소드(순수 가상 메소드) 선언 없이 클래스를 추상화 시키는 편리한 방법이다. 또한 메소드는 abstract 키워드로 선언된다.









■ 생성자
C++/CLI 클래스의 생성자는 기본 인수(Default parameter)를 가질 수 없다.
namespace ManagedMemFileEx
{
	public ref class CCliMemFileEx
	{
    public:
        explicit CCliMemFileEx(System::UInt32 _nGrowBytes = 1024);
        virtual ~CCliMemFileEx();
    };
}

위와 같이 기본 인자를 가진 생성자를 정의하면 다음과 같은 에러 메시지를 출력 한다.

"오류 1 error C3222: '_nGrowBytes' : 제네릭 함수 또는 관리되는 형식의 멤버 함수에 대한 기본 인수를 선언할 수 없습니다."





■ 참조
1. C++/CLI Primer - Enter the World of .NET Power Programming (CodeProject)
2. Quick C++/CLI - Learn C++/CLI in less than 10 minutes (CodeProject)


출처 : http://six605.tistory.com/385

저작자 표시 비영리 동일 조건 변경 허락
신고

'Programming > C++/CLI' 카테고리의 다른 글

C++ Interop 사용(암시적 PInvoke)  (0) 2010.09.14
C++/CLI에 대해서 알아두어야 할 것들  (0) 2010.09.13
C++/CLI Type  (2) 2010.09.13
Win32 API TYPE <-> C# TYPE  (0) 2010.07.20
C#, Managed C++ 참고 자료  (0) 2010.06.25
C++/CLI 빌드 시, LNK2019 에러 #3  (0) 2010.06.07
Posted by blueasa
TAG C++/CLI, type

댓글을 달아 주세요

  1. 2012.04.04 16:48 신고 암겨혀  댓글주소  수정/삭제  댓글쓰기

    std::list 에 대응하는 클래스는 LinkedList ^ 아닌가요;

    • 2012.04.04 19:00 신고 blueasa  댓글주소  수정/삭제

      암겨혀님 말씀대로 std::list는 더블 링크드 리스트인 LinkedList가 맞을 것 같네요.
      저도 리플보고 처음 찾아보게 됐는데요. 프레임워크2.0부터 사용가능한 클래스네요.
      위 글 저자분이 사용한 프레임웍에서는 없어서 대체사용하신 건지는 잘 모르겠습니다.
      좋은 하루 되세요. :)


C# 레퍼런스 모음.

C/C++ 을 하다가 C# 으로 추가 개발을 하려는 사람에게 꼭 필요한 것들을 모아봤음.
직접 해보면서 삽질한 내용임.

C# eBook
http://www.bestsoftware4download.com/software/t-free-c-school-ebook-download-llijghlw.html
http://www.pnasoft.com/archive/2008/01/11/pro-csharp-2008-and-the-net-3-5-platform-4th-edition.aspx

C++ / CLI, Managed C++ eBook
http://int6.net/ebook/Expert.Cpp.Cli.NET.pdf

C# memcpy (링크를 까먹어서 -_- 코드로 대체)


// copied from group.google.com 
public object raw_deserialize_ex(byte[] rawdatas, Type anytype) 
{ 
 int rawsize = Marshal.SizeOf(anytype); 
 if (rawsize > rawdatas.Length) 
   return null; 
 GCHandle handle = GCHandle.Alloc(rawdatas, GCHandleType.Pinned); 
 IntPtr buffer = handle.AddrOfPinnedObject(); 
 object retobj = Marshal.PtrToStructure(buffer, anytype); 
 handle.Free(); 
 return retobj; 
} 
 
// copied from group.google.com 
public byte[] raw_serialize_ex(object anything) 
{ 
 int rawsize = Marshal.SizeOf(anything); 
 byte[] rawdatas = new byte[rawsize]; 
 GCHandle handle = GCHandle.Alloc(rawdatas, GCHandleType.Pinned); 
 IntPtr buffer = handle.AddrOfPinnedObject(); 
 Marshal.StructureToPtr(anything, buffer, false); 
 handle.Free(); 
 return rawdatas; 
}


Block Copy
http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx

Byte[] to String
System.Text.Encoding.UTF8.GetString(...);

String to Byte[]
ASCIIEncoding.UTF8.GetBytes(...);

[Managed C++] System::String^ <-> std::string
http://www.codeguru.com/forum/showthread.php?p=1722705#post1722705

UI Invoke (다른 Thread 에서 ui 를 업데이트 하려면 invoke 를 거쳐가야함.)
http://msdn.microsoft.com/en-us/library/system.windows.forms.form.invoke.aspx
i.e.) this.Invoke(new _set_btn_enable_delegate(_set_btn_enable));

Property Grid
http://msdn.microsoft.com/en-us/library/aa302326.aspx

XML Serializer
http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

CRC32, MD5, SHA1
http://www.vbaccelerator.com/home/net/code/Libraries/CRC32/article.asp
http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha1cryptoserviceprovider.aspx

Native C++ <-> Unmanaged C++ <-> C#
http://sj21.wo.to/tt/483
http://sj21.wo.to/tt/484
http://blogs.msdn.com/junfeng/archive/2006/05/20/599434.aspx

Application 정보는 System.Application
Environment 정보는 System.Environment

다른 Application 실행시키려면
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.aspx


일단 이정도.

위의 내용만 잘 숙지해도, 기본적인 개발은 할 수 있음.


출처 : http://eeodl.blogspot.com/2008/11/c-managed-c.html

저작자 표시
신고

'Programming > C++/CLI' 카테고리의 다른 글

C++/CLI Type  (2) 2010.09.13
Win32 API TYPE <-> C# TYPE  (0) 2010.07.20
C#, Managed C++ 참고 자료  (0) 2010.06.25
C++/CLI 빌드 시, LNK2019 에러 #3  (0) 2010.06.07
C++/CLI 빌드 시, LNK2019 에러 #2  (0) 2010.06.07
C++/CLI 빌드 시, LNK2019 에러 #1  (0) 2010.06.07
Posted by blueasa
TAG c#, C++/CLI

댓글을 달아 주세요