관리코드와 비관리코드를 혼합해서 사용할 때
서로간에 문자열을 주고 받아야 하는 경우가 종종 있을 것입니다. 관리코드와 비관리코드간에 문자열을 서로
어떻게 변환하여 주고 받는지 알아보겠습니다.
1) C/C++ 문자열을 String^으로 변환
먼저 아래의 변환 예제 코드를 봐 주세요
#include
<msclr\marshal.h>
using
namespace System;
using
namespace msclr::interop;
int main()
{
const char* message = "Forever
Visual C++";
String^ result1 =
marshal_as<String^>( message );
Console::WriteLine("char ->
System::String : {0}", result1);
const wchar_t* Wmessage =
L"Visual C++이여 영원하라";
String^ result2 =
marshal_as<String^>( Wmessage );
Console::WriteLine("wchar ->
System::String : {0}", result2);
getchar();
return 0;
}
관리코드와 비관리코드 간의 문자열 변환에는
‘msrshal_as’를 사용하여 마샬링합니다.
C/C++ 문자열을 마샬링하기 위해서는
파일을 포함하고,
네임스패이스를 선언합니다.
사용 방법은 아주 간단합니다.
ANSI 문자열을 관리코드의 문자열로 변환할 때는 아래와 같이 합니다.
const char*
message = "Forever Visual C++";
String^ result1 = marshal_as<String^>( message );
유니코드를 관리코드의 문자열로 변환할 때는
아래와 같이 합니다.
const
wchar_t* Wmessage = L"Visual C++이여
영원하라";
String^ result2 = marshal_as<String^>( Wmessage );
2) STL의 string과
String^간의 변환
이것도 marshal_as를
사용합니다.
아래의 예제 코드를 봐 주세요
#include
<iostream>
#include
<string>
#include
<msclr\marshal_cppstd.h>
using
namespace System;
using
namespace msclr::interop;
int main()
{
std::string s0 = "비주얼스튜디오2010 팀블로그";
std::cout << "string :
" << s0 << std::endl;
System::String^ s1 = marshal_as<
System::String^ >(s0);
Console::WriteLine("std::sting->System::String
: {0}", s1);
std::wstring s2 = marshal_as<
std::wstring >(s1);
setlocale(LC_ALL, "");
std::wcout <<
"System::String->std::wstring : " << s2 << std::endl;
getchar();
return 0;
}
STL의 문자열과 변환하기 위해서는 다음의 헤더 파일을 포함해야 합니다.
마샬링하는 방법은 앞에 설명한 C/C++ 문자열 변환과 같습니다.
주제와 좀 관계 없는 것으로 콘솔창에 유니코드
문자열을 출력하는 방법은 아래와 같습니다.
setlocale(LC_ALL,
"");
std::wcout << "System::String->std::wstring : " << s2 << std::endl;
관리코드 문자열과 비관리코드 문자열간의 변환에
따른 성능
C++로 만드는 프로그램은 보통 고성능을 원하는 프로그램이므로 보통 C++ 프로그래머는 성능에 민감합니다. 마샬링은 공짜가 아닙니다만
많은 양을 아주 빈번하게 마샬링 하는 것이 아니면 성능에 너무 신경 쓰지 않아도 됩니다. 다만 기본적으로
관리코드의 문자열은 유니코드입니다. 그래서 비관리코드의 문자열이
ANSI 코드라면 유니코드를 사용했을 때 보다 더 많은 시간이 걸립니다(정확한 수치는 잘
모르지만 ANSI가 유니코드보다 3배정도 더 걸린다고도 합니다). 그래서 관리코드와 비관리코드를 같이 사용할 때는 가능한 유니코드를 사용하는 것이 훨씬 좋습니다.
아직 설명할 것이 많이 남아 있습니다. 다음을 기다려주세요^^
'C++/CLI' 카테고리의 다른 글
[Step. 07] 비관리 클래스에서 관리 클래스를 멤버로, 관리 클래스에서 비관리 클래스를 멤버로 (0) | 2010.07.30 |
---|---|
[Step. 06-2] 관리코드의 문자열과 비관리코드의 문자열 변환 (3) | 2010.07.23 |
[Step. 05] 관리 코드의 array를 비관리 코드에 포인터로 전달 (0) | 2010.07.09 |
[Step. 04] nullptr, interior_ptr, pin_ptr (2) | 2010.06.25 |
[step.03] 배열 (1) | 2010.06.18 |