관리코드와 비관리코드를 혼합해서 사용할 때
서로간에 문자열을 주고 받아야 하는 경우가 종종 있을 것입니다. 관리코드와 비관리코드간에 문자열을 서로
어떻게 변환하여 주고 받는지 알아보겠습니다.
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. 06-1] 관리코드의 문자열과 비관리코드의 문자열 변환 (3) | 2010/07/16 |
| [Step. 05] 관리 코드의 array를 비관리 코드에 포인터로 전달 (0) | 2010/07/09 |
| [Step. 04] nullptr, interior_ptr, pin_ptr (2) | 2010/06/25 |
| [step.03] 배열 (2) | 2010/06/18 |




댓글을 달아 주세요
안녕하세요~ CLR 프로젝트를 하다가 컴파일 오류가 발생했는데 해결 방법을 몰라서요.
VS2010에서 CLR 클래스 라이브러리 프로젝트를 생성하고 cpp 파일에 아래의 두 줄을 넣어서 컴파일하면 "error C2872: 'IServiceProvider' : 모호한 기호입니다." 오류가 발생하네요
// 기본 DLL 파일입니다.
#include "stdafx.h"
#include "CLRLibTest.h"
#include <string> -> 이거
#include <msclr/marshal_cppstd.h> -> 이거
새로 생성한 프로젝트에 있는 cpp 파일에 넣은 것이구요. C++ 프로젝트에서 std::string 값을 받아서 C#으로 넘기는데 Managed C++을 사용한 것이구요. 다른 방법으로 해야하나요?
"CLR 콘솔 응용 프로그램"으로 프로젝트를 생성하면 이상이 없는데...
#include <string>을 해야하는 이유는 c++의 class에 아래와 같이 선언되어 있어서요
class cData
{
public:
std::string m_StringValue;
생략...
};
혹시 몰라서 첨부파일을 올리고 싶은데 방법이 없네요. 데브피아에 올렸던 파일이 있는데 다운로드하기 위해서 설치해야하지 않으면 아래의 URL에서 받을 수는 있어요.
http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=883693&ref=883693&page=1
혹시나 오래된 글이지만 보시게 되면 부탁 좀 드려보겠습니다.