VisualStudio2010 블로그를 읽다가 정리한 것 뿐입니다.
Managed 클래스 구조체 선언은 {class, struct} 앞에 {ref, value, interface, enum} 중에 다른 것을 하나 붙여서 사용.
Native와 같이 사용 되는 경우, 구분 짓기 위해서 그런 것 같다. ( 그렇다면 그냥 클래스를 사용하는 것도 가능? )
class_access ref class name modifier : inherit_access base_type {};
ref 로 선언한 관리클래스는
ref class SampleClass { public: SampleClass() {} ~SampleClass() {} !SampleClass() {} }; //코드 { SampleClass^ _a = gcnew SampleClass(); }
value
value 특징
관리클래스를 파라미터로 넘기기
void func( A^ a ) {}
참조
nullptr
interior_ptr
pin_ptr
ref class REFClass { public: int nValue; }; void SetValue( int* pValue ) { *pValue = 100; } int main() { REFClass^ refClass = gcnew REFClass; pin_ptr<int> pValue = &refClass->nValue; SetValue( pValue ); pValue = nullptr; }
array 클래스 생성 할때는 포인터 타입으로 선언해 주어야 합니다. (어찌보면 당연한??)
class CNative { /* sample class */ }; // other func { array< CNative* >^ _arr = gcnew array< CNative* >(2); array< CNative >^ _arr = gcnew array< CNative >(2); }
사용할때는 직접 메모리를 할당해줘야 합니다.
for(int i=0; i<arr->Length; i++) { arr[i] = new CNative(); }
또한 당연하지만, 삭제할 때도 직접 삭제해 줘야한다. GC 가 삭제해 주지 않는다.
for( int i = 0; i < arr->Length; i ++ ) { delete arr[i]; }
이건 거의 팁이군요. 그래도 알면 요긴하게 쓸 수 밖에 없는 팁인 듯.
물론 코드는, vsts2010.net 에서 가져왔습니다.
#pragma unmanaged extern "C" void printf(const char*, ...); class A { // 꼭 static 을 써야 하는 건지?? public: void func(char* s) { printf(s); } }; #pragma managed public delegate void func(char*); ref class B { public: A* ap; B(A* ap):ap(ap) {} void func(char* s) { ap->func(s); } }; int main() { A* a = new A; B^ b = gcnew B(a); func^ f = gcnew func(b, &B::func); f("hello"); delete a; }
=0 대신 abstract 를 사용
순 가상함수를 추가하면 클래스도 순 가상 클래스가 될 필요가 있으므로 클래스에도 abstract 를 붙입니다.
public ref class Server abstract { ..... virtual void OnAccept() abstract; };
이것도 꽤 요긴할 것 같네요. C++/CLI 마샬링은 요기 (Overview of Marshaling in C++ )에 잘 나와 있습니다.
블로그 내용을 그대로 가져왔습니다.
// 비관리코드 int nPacketSize = 34; char* pPacket = new char[34]; // 관리코드 array< Byte >^ byteArray = gcnew array< Byte >(nPacketSize); System::Runtime::InteropServices::Marshal::Copy( (IntPtr)pPacket, byteArray, 0, nPacketSize );
// 관리코드 array<Byte>^ SendData; // 비관리코드 int nLength = SendData->Length; pin_ptr<Byte> pData = &SendData[0]; char* pBuffer = new char[ nLength ]; CopyMemory( pBuffer, pData, nLength );
참고로 C++/CLI에서는 바이트형 배열 array<Byte>가 C#에서는 byte[] 이 됩니다.
ManagedCpp ManagedC++