Nasıl yapılır: C++ Birlikte Çalışması Kullanarak ANSI Dizelerini Sıralama
Bu konu C++ Birlikte Çalışma kullanılarak ANSI dizelerinin nasıl geçirilebileceğini gösterir, ancak .NET Framework String dizeleri Unicode biçiminde temsil eder, bu nedenle ANSI'ye dönüştürme ek bir adımdır. Diğer dize türleriyle birlikte çalışma için aşağıdaki konulara bakın:
Nasıl yapılır: C++ Çalışabilirliği Kullanarak Unicode Dizelerini Sıralama
Nasıl yapılır: C++ Birlikte Çalışması Kullanarak COM Dizelerini Sıralama
Aşağıdaki kod örnekleri yönetilen ve yönetilmeyen işlevleri aynı dosyada uygulamak için yönetilen, yönetilmeyen #pragma yönergelerini kullanır, ancak bu işlevler ayrı dosyalarda tanımlanırsa aynı şekilde birlikte çalışır. Yalnızca yönetilmeyen işlevleri içeren dosyaların /clr (Ortak Dil Çalışma Zamanı Derlemesi) ile derlenmesi gerekmediğinden, performans özelliklerini koruyabilirler.
Örnek: ANSI dizesini geçirme
Örnekte, kullanılarak StringToHGlobalAnsiyönetilen bir ANSI dizesini yönetilmeyen bir işleve geçirme gösterilmektedir. Bu yöntem yönetilmeyen yığında bellek ayırır ve dönüştürmeyi gerçekleştirdikten sonra adresi döndürür. Bu, sabitlemenin gerekli olmadığı anlamına gelir (GC yığınındaki bellek yönetilmeyen işleve geçirilmediği için) ve döndürülen StringToHGlobalAnsi IntPtr'nin açıkça serbest bırakılması veya bellek sızıntısı sonuçları olması gerekir.
// MarshalANSI1.cpp
// compile with: /clr
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;
#pragma unmanaged
void NativeTakesAString(const char* p) {
printf_s("(native) received '%s'\n", p);
}
#pragma managed
int main() {
String^ s = gcnew String("sample string");
IntPtr ip = Marshal::StringToHGlobalAnsi(s);
const char* str = static_cast<const char*>(ip.ToPointer());
Console::WriteLine("(managed) passing string...");
NativeTakesAString( str );
Marshal::FreeHGlobal( ip );
}
Örnek: ANSI dizesine erişmek için gereken veri hazırlama
Aşağıdaki örnek, yönetilmeyen bir işlev tarafından çağrılan yönetilen bir işlevdeki ANSI dizesine erişmek için gereken veri hazırlamayı gösterir. Yerel dizeyi alırken yönetilen işlev, gösterildiği gibi doğrudan kullanabilir veya yöntemini kullanarak yönetilen dizeye PtrToStringAnsi dönüştürebilir.
// MarshalANSI2.cpp
// compile with: /clr
#include <iostream>
#include <vcclr.h>
using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;
#pragma managed
void ManagedStringFunc(char* s) {
String^ ms = Marshal::PtrToStringAnsi(static_cast<IntPtr>(s));
Console::WriteLine("(managed): received '{0}'", ms);
}
#pragma unmanaged
void NativeProvidesAString() {
cout << "(native) calling managed func...\n";
ManagedStringFunc("test string");
}
#pragma managed
int main() {
NativeProvidesAString();
}
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin