Szkolenie
Moduł
Konwertowanie typów danych przy użyciu technik rzutowania i konwersji w języku C# - Training
Zapoznaj się z użyciem technik języka C# do rzutowania i konwersji.
Ta przeglądarka nie jest już obsługiwana.
Przejdź na przeglądarkę Microsoft Edge, aby korzystać z najnowszych funkcji, aktualizacji zabezpieczeń i pomocy technicznej.
W tym artykule opisano kilka sposobów konwertowania System::String*
z na char*
przy użyciu rozszerzeń zarządzanych w programie Visual C++.
Oryginalna wersja produktu: Visual C++
Oryginalny numer KB: 311259
W tym artykule opisano następujące przestrzenie nazw biblioteki klas programu Microsoft .NET Framework:
System::Runtime::InteropServices
Msclr::interop
W tym artykule omówiono kilka sposobów konwertowania System::String*
z programu na char*
przy użyciu następujących elementów:
PtrToStringChars
daje wskaźnik wewnętrzny do rzeczywistego String
obiektu. Jeśli przekażesz ten wskaźnik do niezarządzanego wywołania funkcji, musisz najpierw przypiąć wskaźnik, aby upewnić się, że obiekt nie przenosi się podczas procesu asynchronicznego odzyskiwania pamięci:
//#include <vcclr.h>
System::String * str = S"Hello world\n";
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);
StringToHGlobalAnsi
kopiuje zawartość zarządzanego String
obiektu na natywną stertę, a następnie konwertuje ją na format American National Standards Institute (ANSI) na bieżąco. Ta metoda przydziela wymaganą natywną pamięć sterty:
//using namespace System::Runtime::InteropServices;
System::String * str = S"Hello world\n";
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
Marshal::FreeHGlobal(str2);
Uwaga
W programie Visual C++ 2005 i visual C++ 2008 należy dodać opcję kompilatora obsługi środowiska uruchomieniowego języka wspólnego (/clr:oldSyntax), aby pomyślnie skompilować poprzedni przykładowy kod. Aby dodać opcję kompilatora obsługi środowiska uruchomieniowego języka wspólnego, wykonaj następujące kroki:
Kliknij pozycję Project (Projekt), a następnie kliknij pozycję ProjectName Properties (Właściwości projectname).
Uwaga
ProjectName to symbol zastępczy nazwy projektu.
Rozwiń węzeł Właściwości konfiguracji, a następnie kliknij przycisk Ogólne.
W okienku po prawej stronie kliknij, aby wybrać pozycję Obsługa środowiska uruchomieniowego języka wspólnego, stara składnia (/clr:oldSyntax) w ustawieniach projektu obsługi środowiska uruchomieniowego języka wspólnego.
Kliknij Zastosuj a następnie kliknij OK.
Aby uzyskać więcej informacji na temat opcji kompilatora obsługi środowiska uruchomieniowego języka wspólnego, odwiedź następującą witrynę sieci Web Microsoft Developer Network (MSDN):
/clr (Kompilacja środowiska uruchomieniowego języka wspólnego)
Te kroki dotyczą całego artykułu.
Klasa VC7 CString
ma konstruktor, który pobiera zarządzany wskaźnik ciągów i ładuje element CString
z jego zawartością:
//#include <atlstr.h>
System::String * str = S"Hello world\n";
CString str3(str);
printf(str3);
Program Visual C++ 2008 wprowadza klasę marshal_as<T>
pomocy marshala i klasę marshal_context()
pomocnika marshala.
//#include <msclr/marshal.h>
//using namespace msclr::interop;
marshal_context ^ context = gcnew marshal_context();
const char* str4 = context->marshal_as<const char*>(str);
puts(str4);
delete context;
Uwaga
Ten kod nie jest kompilowany przy użyciu rozszerzeń zarządzanych dla języka C++ w programie Visual C++ .NET 2002 lub Visual C++ .NET 2003. Używa nowej składni języka C++/CLI wprowadzonej w programie Visual C++ 2005 oraz nowego kodu przestrzeni nazw msclr wprowadzonego w programie Visaul C++ 2008. Aby pomyślnie skompilować ten kod, należy użyć przełącznika kompilatora /clr C++ w programie Visual C++ 2008.
//compiler option: cl /clr
#include <vcclr.h>
#include <atlstr.h>
#include <stdio.h>
#using <mscorlib.dll>
using namespace System;
using namespace System::Runtime::InteropServices;
int _tmain(void)
{
System::String * str = S"Hello world\n";
//method 1
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);
//method 2
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
Marshal::FreeHGlobal(str2);
//method 3
CString str3(str);
wprintf(str3);
return 0;
}
//compiler option: cl /clr
#include <atlstr.h>
#include <stdio.h>
#using <mscorlib.dll>
using namespace System;
using namespace System::Runtime::InteropServices;
#if _MSC_VER > 1499 // Visual C++ 2008 only
#include <msclr/marshal.h>
using namespace msclr::interop;
#endif
int _tmain(void)
{
System::String ^ str = "Hello world\n";
//method 1
pin_ptr<const wchar_t> str1 = PtrToStringChars(str);
wprintf(str1);
//method 2
char* str2 = (char*)Marshal::StringToHGlobalAnsi(str).ToPointer();
printf(str2);
Marshal::FreeHGlobal((IntPtr)str2);
//method 3
CString str3(str);
wprintf(str3);
//method 4
#if _MSC_VER > 1499 // Visual C++ 2008 only
marshal_context ^ context = gcnew marshal_context();
const char* str4 = context->marshal_as<const char*>(str);
puts(str4);
delete context;
#endif
return 0;
}
Szkolenie
Moduł
Konwertowanie typów danych przy użyciu technik rzutowania i konwersji w języku C# - Training
Zapoznaj się z użyciem technik języka C# do rzutowania i konwersji.