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

카테고리

분류 전체보기 (2738)
Unity3D (817)
Programming (475)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (58)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (53)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
05-03 19:49

//-- 인코딩 지정 변환 예

System::Text::Encoding^ m_encoding;

m_encoding = gcnew System::Text::UTF8Encoding();
m_stat, sql::SQLException* : legacy native c++ pointer

int execute(String^ sql) 
try {
assert(m_stat); 
if (!m_encoding) {
return m_stat->execute(getAnsiString(sql)); //.net -> native
} else {

array<unsigned char>^ bytes = m_encoding->GetBytes(sql);
pin_ptr<unsigned char> s = &bytes[0];
return m_stat->execute((const char*)s);   //.net -> native
}
} catch (sql::SQLException *ex) {
throw gcnew SQLException(ex, sql);
}
}

//-- utf8 로 저장된 문자열 배열을, .net 유니코드 문자열 배열로 변환
array<String^>^ convStrArray(const std::vector<std::string> &arrStr) //native -> .net
{
size_t cnt = arrStr.size();
UTF8Encoding^ encode = gcnew UTF8Encoding(true,true);
        array<String^>^ arr = gcnew array<String^>(cnt);
        for (size_t i = 0; i < cnt; i++)
            arr[i] = gcnew String(arrStr[i].c_str(), 0, arrStr[i].size(), encode);

        return arr;
}


//-- strconv.h, vs2005/8

#pragma once

#include <vcclr.h>
#include <string>

using namespace System;
using namespace System::Runtime::InteropServices;

inline
std::string getAnsiString(String^ s) 
{
    IntPtr ip = Marshal::StringToHGlobalAnsi(s);
    const char* str = static_cast<const char*>(ip.ToPointer());

    std::string ansi(str);
    
    Marshal::FreeHGlobal( ip );

    return ansi;
}

inline
std::wstring getUniString(String^ s)
{
    pin_ptr<const wchar_t> str = PtrToStringChars(s);

    std::wstring uni(str);
    return uni;
반응형

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

System::String -> char* OR wchar_t*  (0) 2010.05.26
CLI - 초무식, 초단순 암기용 저장글  (0) 2010.05.26
C++/CLI 예제  (0) 2010.05.25
참고 사이트  (0) 2010.05.25
CLI의 기본 타입  (0) 2010.05.25
Posted by blueasa
, |

C++/CLI 예제

Programming/C++/CLI / 2010. 5. 25. 22:27
반응형

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

CLI - 초무식, 초단순 암기용 저장글  (0) 2010.05.26
Managed 문자열 -> Unmanaged 문자열 변환  (0) 2010.05.26
참고 사이트  (0) 2010.05.25
CLI의 기본 타입  (0) 2010.05.25
C++/CLI 관련 용어 정리  (0) 2010.05.25
Posted by blueasa
, |

참고 사이트

Programming/C++/CLI / 2010. 5. 25. 17:33
반응형

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

Managed 문자열 -> Unmanaged 문자열 변환  (0) 2010.05.26
C++/CLI 예제  (0) 2010.05.25
CLI의 기본 타입  (0) 2010.05.25
C++/CLI 관련 용어 정리  (0) 2010.05.25
C++/CLI 강좌: C++/CLI와 C#  (0) 2010.05.25
Posted by blueasa
, |

C++/CLI 역시 CLI의 한 구현물이다 보니 CTS에서 말하는 기본 타입을 모두 지원한다.
다음 표에 13개의 기본 타입을 요약해놨는데,
다행히 이런 기본 타입은 네이티브 쪽이나 관리되는 코드 쪽이나 같은 키워드를 사용하므로 금방 익숙해진다.


CLI 타입

C++/CLI 키워드

예제

설명

System::Boolean

bool

bool success = true;

true/false

System::Byte

unsinged char

unsigned char c = 'c';

부호 없는 8비트 정수

System::Char

wchar_t

wchar_t wc = L'w';

유니코드 문자

System::Double

double

double d = 1.1E-11;

8바이트짜리 배정밀도 부동 소수점

System::Int16

short

short s = 12;

16비트 정수

System::Int32

int, long

int i = 100;

32비트 정수

System::Int64

__int64, long long

__int64 i = 100;

64비트 정수

System::SByte

char

char c = 'T';

8비트 정수

System::Single

float

float i = 1.01f

4바이트짜리 단정밀도 부동 소수점

System::Uint16

unsigned short

unsigned short i = 100;

부호 없는 16비트 정수

System::UInt32

unsigned int, unsigned long

unsigned int i = 100;

부호 없는 32비트 정수

System::UInt64

unsigned __int64, unsigned long long

unsigned __int64 i = 100;

부호 없는 64비트 정수

Void

void

 

타입 없는 데이터나 데이터 없음

반응형

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

C++/CLI 예제  (0) 2010.05.25
참고 사이트  (0) 2010.05.25
C++/CLI 관련 용어 정리  (0) 2010.05.25
C++/CLI 강좌: C++/CLI와 C#  (0) 2010.05.25
expert_cppcli_.net_for_visual_cpp_programmers.pdf  (0) 2010.05.24
Posted by blueasa
, |

1. CLI(Common Language Infrastructure) : 공통 언어 기반
- ECMA의 공인을 받은 공개된 명세.(구현이 아님)
- "공통 언어라 불리려면 이것 저것 등등을 구현해야 한다"고 적어놓은 문서.
- CLI는 표준 명세이고, 이에 맞춰 구현하는 일은 각 벤더나 오픈 소스 프로젝트의 몫
- CLI 명세에 따른 구현물 : .NET Framework, 모노, DotGNU

2. .NET Framework
- CLI 명세에 따라 MicroSoft사가 개발한 구현물.
- CLR(Common Language Runtime:공통 언어 런타임)과 BCL(Base Class Library)가 포함.

3. BCL(Base Class Library) : 기본 클래스 라이브러리
- MS 제공
- CLI에 명세로 기록된 기본 타입을 제외한 .NET Framework의 나머지는 BCL에 속함.
- 사실상 mscorlib만 CLI 명세에 따른 구현물일 뿐 나머지는 BCL에 속함.
- System.Web(웹 개발 관련 기능 제공)
- System.Data(네임스페이스/데이터베이스 관련 기능 제공)
- 그 외 : System / System.Xml / System.Drawing / System.Windows.Forms / Microsoft.VisualC
            / MicroSoft.Build.Utilities / Microsoft.Build.Framework

4. CTS(Common Type System) : 공용 형식 시스템
- 런타임에서 형식을 선언하고 사용 및 관리하는 방법을 정의
- 언어 간 통합에 대한 런타임 지원의 중요한 부분을 차지

5. CLS(Common Language Specification) : 공용 언어 사양
- 많은 응용 프로그램에 필요한 기본 언어 기능 집합.
- CTS의 하위 집합을 정의.
- 따라서 CTS에 적용되는 모든 규칙은 CLS에도 적용되며, 둘 중 CLS 규칙이 더 엄격함.
- "CLS-Compliant인 코드라면 C#, F#, IronPython 등 언어를 가리지 않고 잘 돌아간다"는 뜻이다.
- 언어 간 호환성을 위한 최소 조건


반응형

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

참고 사이트  (0) 2010.05.25
CLI의 기본 타입  (0) 2010.05.25
C++/CLI 강좌: C++/CLI와 C#  (0) 2010.05.25
expert_cppcli_.net_for_visual_cpp_programmers.pdf  (0) 2010.05.24
wrapping 자동화 관련..  (0) 2010.05.24
Posted by blueasa
, |
반응형

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

C++/CLI 관련 용어 정리  (0) 2010.05.25
C++/CLI 강좌: C++/CLI와 C#  (0) 2010.05.25
wrapping 자동화 관련..  (0) 2010.05.24
C++/CLI Quick Referrence  (0) 2010.05.24
c++ lib 를 c# 에서 사용하기 (c++/cli)  (0) 2010.05.17
Posted by blueasa
, |
반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |

이번에 파티클 에디터를 만들면서 mfc 말고 c# 을 사용해보았는데 c# 문법에 대한 자료는 많지만,

c++ lib 를 c# 에서 사용하는 방법에 대해 자세히 나온곳이 없어서 간단하게 정리해보았습니다.

 

작업순서는

1) c++ 로 lib 작성 (lib)

2) c++/cli 로 wrapper 를 만들고 (dll)

3) c# 에서 wrapper dll 를 호출해서 작업을 하게됩니다.

 

 

직접 해보자면

1) c++ 로 lib 를 하나 만듭니다. 저는 간단하게 다음과 같은 class 를 만들었습니다.

 

class cppLib

{

public :

        int     addValue( int value1, int value2 )

        {

               return ( value1 + value2 );

        }

};
 
 
2) 그 다음에는 c++/cli 로 프로젝트를 만듭니다.

 

 
 
이곳에서 아까 만든 lib 를 link 시켜서 wrapper class 를 만듭니다.
 
[ header ]

namespace cliWrap

{

        public ref class cppLibWrap

        {

        protected :

               cppLib *       m_pCppLib;

 

        public :

               cppLibWrap();

               virtual ~cppLibWrap();

 

               int     addValue( int value1, int value2 );

        };

 

} // namespace - cliWrap

 

 

[ source ]

namespace cliWrap

{

        cppLibWrap::cppLibWrap() : m_pCppLib( new cppLib )

        {}

 

        cppLibWrap::~cppLibWrap()

        {

               if( m_pCppLib )

               {

                       delete m_pCppLib;

                       m_pCppLib = 0;

               }

        }

 

        ////////////////////////////////////////////////////////// 

        int     cppLibWrap::addValue( int value1, int value2 )

        {

               return m_pCppLib->addValue( value1, value2 );

        }

 

} // namespace - cliWrap

 

 

3) wrapper class 작성이 끝났으면  c# 으로 프로젝트를 만듭니다.


 

c# 프로젝트 생성후에 위에서 작업한 2개의 프로젝트를 추가시켜줍니다.

 

wrapper class 쪽에서 만들어지는 dll 을 c# 에서 사용하게 되는데 매번 변경사항이

있을때마다 복사하기가 번거롭기 때문에 빌드시마다 자동으로 복사해주는 작업을 해줍시다.

 

 

Command Line 에 copy "$(TargetPath)" "$(SolutionDir)\simpleProject\$(TargetFileName)" 를

자신의 프로젝트 폴더에 맞게 적당히 수정해서 적어줍니다.

 

 

그 후에 dll 복사를 위해 wrapper 프로젝트를 다시 빌드해줍니다.

이제 c# 프로젝트에 c++/cli 로 만든 dll 을 붙여줍니다.
 

 

아까 만든 wrapper class dll 을 추가시켜줍니다.

 


 

 

이제 작업이 끝났습니다.

c# 프로젝트에서는 다음과 같이 그냥 사용하시면 됩니다.

 

namespace simpleProject

{

    public partial class Form1 : Form

    {

        private cliWrap.cppLibWrap m_cppLibWrap = null;

 

        public Form1()

        {

            InitializeComponent();

 

            m_cppLibWrap = new cliWrap.cppLibWrap();

 

            int returnValue = m_cppLibWrap.addValue(1, 2);

 

            MessageBox.Show(returnValue.ToString());

        }

    }

}
 

 
이제 Property Grid 를 비롯해 c# 의 막강한 기능을 누리시면 됩니다.
 
다음에는 c# 에서 Property Grid 를 붙힐때 c++ lib 작업시에 미리 등록을 해서
자동화하는 방법에 대해 설명하고자 하는데 언제가 될지는 모르겠습니다. 하하~
 
 
ps. c#, c++/cli 문법에 대한것은 인터넷에 많기때문에 이곳에서 다루지 않았습니다.
참고할만한 c# 서적이 pdf 로 공개되어있습니다. 참고하시길 바랍니다.
반응형
Posted by blueasa
, |

C++이 주력 프로그래밍 언어이고 VC++ MVP이니 2009년에 C++/CLI을 완전히 마스터해 볼 생각입니다.

아직까지는 네이티브 C++ 코드와의 연동 하는 경우가 적지 않으니 잘 알고 있으면 아주 유익하리라 생각합니다.

봄 이후부터는 조금씩이라도 C++/CLI 입문, C/C++과 C++/CLI 연동 관련 글을 포스팅 하겠습니다.

 

C++/CLI Quick Referrence

http://jundols.springnote.com/pages/1721142

C++/CLI Tutorial

http://www.functionx.com/cppcli/index.htm


C++/CLI Primer (영어)
http://www.codeguru.com/cpp/cpp/cpp_managed/general/article.php/c14815__1/


CodeGuru의 C++/CLI (영어)
http://www.codeguru.com/cpp/cpp/cpp_managed/


CodeProject의 C++/CLI (영어)
http://www.codeproject.com/KB/mcpp/



C++/CLI을 사용하여 C 라이브러리를 .NET화 하자  (일어)
http://codezine.jp/article/detail/1382?p=1


C++/CLI 입문 (일어)
http://www13.plala.or.jp/kmaeda/cpp_cli/cpp_cli.htm


C++ 프로그래머를 위한 C++/CLI 입문
http://cppcli.shacknet.nu/


C++/CLI 언어사양(Ecma 372) 일본어 번역 (일어)
http://vene.wankuma.com/ecma372/StartingState.aspx


C++/CLI Tip  (일어)
http://vene.wankuma.com/prog/CppCli_Generics.aspx


처음부터 시작하는 Visual C++ 2005 입문  (일어)
http://itpro.nikkeibp.co.jp/article/COLUMN/20061206/256112/?ST=develop

반응형
Posted by blueasa
, |