以下にC++/CLIのプログラムを示します。(Visual C++ 2008 Express EditionのCLRプロジェクトで確認されています)
#using
using namespace System;
#include
#include
#include
#pragma unmanaged
//アンマネージのC関数
const wchar_t* wgreet(const wchar_t* name)
{
static wchar_t result[128];
wcscpy_s(result, 128, name);
wcscat_s(result, 128, L"さん、こんにちは");
return result;
}
#pragma managed
//std::wstring から System.String^ への変換
String^ ToCLI(std::wstring& input)
{
return gcnew String(input.c_str() );
}
//System.Sttring から std::wstringへの変換
std::wstring FromCLI(String^ input)
{
std::wstring result;
if( input != nullptr && input->Length > 0 )
{
// System::String をChar 型 = wchar_t 型の配列にする
array^ warr = input->ToCharArray();
// 配列がガベージ・コレクトによって移動しないようピンニング
pin_ptr pin = &warr[0];
result.assign(pin, input->Length);
}
return result;
}
String^ Greet(String^ name)
{
std::wstring input = FromCLI(name); //System::String^をstd::wstringへ変換
std::wstring result = wgreet(input.c_str()); //wgreet呼び出し
return ToCLI(result); //std::wstringをSystem::String^へ変換
}
int main(array^ args)
{
Console::WriteLine(L"{0}", Greet(L"プログラマ"));
Console::ReadKey();
return 0;
}