C++ Birlikte Çalışabilirliği Kullanma (Örtük PInvoke)
Diğer .NET dillerinden farklı olarak, Visual C++ yönetilen ve yönetilmeyen kodun aynı uygulamada ve hatta aynı dosyada (yönetilen, yönetilmeyen pragmalar ile) var olmasına olanak tanıyan birlikte çalışabilirlik desteğine sahiptir. Bu, Visual C++ geliştiricilerinin uygulamanın geri kalanını rahatsız etmeden .NET işlevselliğini mevcut Visual C++ uygulamalarıyla tümleştirmesine olanak tanır.
Yönetilmeyen işlevleri dllexport, dllimport kullanarak yönetilen bir compiland'dan da çağırabilirsiniz.
Örtük PInvoke, işlev parametrelerinin nasıl sıralandığını veya DllImportAttribute açıkça çağrılırken belirtilebilen diğer ayrıntıları belirtmeniz gerekmediğinde kullanışlıdır.
Visual C++ yönetilen ve yönetilmeyen işlevlerin birlikte çalışabilmesi için iki yol sağlar:
Açık PInvoke, .NET Framework tarafından desteklenir ve çoğu .NET dilinde kullanılabilir. Ancak adından da anlaşılacağı gibi, C++ Birlikte Çalışma Visual C++'a özgüdür.
C++ Birlikte Çalışma
C++ Birlikte Çalışma daha iyi tür güvenliği sağlar ve uygulanması genellikle daha az zahmetli olur. Ancak, yönetilmeyen kaynak kodu yoksa veya platformlar arası projeler için C++ Birlikte Çalışma bir seçenek değildir.
C++ COM Birlikte Çalışma
Visual C++ tarafından desteklenen birlikte çalışabilirlik özellikleri, COM bileşenleriyle birlikte çalışma konusunda diğer .NET dillerine göre belirli bir avantaj sunar. C++ Birlikte Çalışma, veri türleri için sınırlı destek ve her COM arabiriminin her üyesinin zorunlu olarak kullanıma açılması gibi .NET Framework Tlbimp.exe (Tür Kitaplığı İçeri Aktarıcı) kısıtlamalarıyla sınırlı kalmak yerine COM bileşenlerine istendiği zaman erişilmesine izin verir ve ayrı birlikte çalışma derlemeleri gerektirmez. Visual Basic ve C#'den farklı olarak, Visual C++ com nesnelerini doğrudan normal COM mekanizmalarını (CoCreateInstance ve QueryInterface gibi) kullanarak kullanabilir. Bunun nedeni, derleyicinin yönetilen işlevlerden yönetilmeyen işlevlere ve geri dönmek için geçiş kodunu otomatik olarak eklemesine neden olan C++ Birlikte Çalışma özellikleri olabilir.
COM bileşenleri, C++ Birlikte Çalışma kullanılarak normalde kullanıldıkları gibi kullanılabilir veya C++ sınıflarında sarmalanabilir. Bu sarmalayıcı sınıfları özel çalışma zamanı çağrılabilir sarmalayıcıları veya CRCW'ler olarak adlandırılır ve com'u doğrudan uygulama kodunda kullanmaya kıyasla iki avantajı vardır:
Sonuçta elde edilen sınıf Visual C++ dışındaki dillerde kullanılabilir.
COM arabiriminin ayrıntıları yönetilen istemci kodundan gizlenebilir. .NET veri türleri yerel türler yerine kullanılabilir ve veri hazırlama ayrıntıları CRCW içinde saydam bir şekilde gerçekleştirilebilir.
COM'un doğrudan mı yoksa CRCW aracılığıyla mı kullanıldığına bakılmaksızın, basit, kesilebilir türler dışındaki bağımsız değişken türleri sıralanmalıdır.
Blittable Türleri
Basit, iç türler (bkz . Blittable ve Blittable Olmayan Türler) kullanan yönetilmeyen API'ler için, bu veri türlerinin bellekte aynı gösterimi olduğundan özel kodlama gerekmez, ancak daha karmaşık veri türleri için açık veri hazırlama gerekir. Bir örnek için bkz . Nasıl yapılır: PInvoke Kullanarak Yönetilen Koddan Yerel DLL'leri Çağırma.
Örnek
// vcmcppv2_impl_dllimp.cpp
// compile with: /clr:pure user32.lib
using namespace System::Runtime::InteropServices;
// Implicit DLLImport specifying calling convention
extern "C" int __stdcall MessageBeep(int);
// explicit DLLImport needed here to use P/Invoke marshalling because
// System::String ^ is not the type of the first parameter to printf
[DllImport("msvcrt.dll", EntryPoint = "printf", CallingConvention = CallingConvention::Cdecl, CharSet = CharSet::Ansi)]
// or just
// [DllImport("msvcrt.dll")]
int printf(System::String ^, ...);
int main() {
// (string literals are System::String by default)
printf("Begin beep\n");
MessageBeep(100000);
printf("Done\n");
}
Begin beep
Done
Bu Bölümde
Nasıl yapılır: C++ Birlikte Çalışması Kullanarak ANSI Dizelerini Sıralama
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
Nasıl yapılır: C++ Birlikte Çalışması Kullanarak Yapıları Sıralama
Nasıl yapılır: C++ Birlikte Çalışması Kullanarak Dizileri Sıralama
Nasıl yapılır: C++ Birlikte Çalışmayı Kullanarak Geri Çağrıları ve Temsilcileri Sıralama
Nasıl yapılır: C++ Birlikte Çalışması Kullanarak Katıştırılmış İşaretçileri Sıralama
Nasıl yapılır: char * Dizesini System::Byte Dizisine Dönüştürme
Nasıl yapılır: System::String'i wchar_t* veya char* olarak dönüştürme
Nasıl yapılır: Standart Dizeyi System::String Olarak Dönüştürme
Nasıl yapılır: Yönetilmeyen Kaynakları Bayt Dizisine Yükleme
Nasıl yapılır: Bir Resmin Yerel mi yoksa CLR mi olduğunu belirleme
Nasıl yapılır: Yerel Tür İçinde Değer Türüne Başvuruyu Tutma
Nasıl yapılır: Yönetilmeyen Bellekte Nesne Başvurusunu Tutma
Nasıl yapılır: C# Tarafından Kullanılması için Yerel Sınıfı Sarmalama
Birlikte çalışma senaryosunda temsilcileri kullanma hakkında bilgi için bkz . temsilci (C++ Bileşen Uzantıları).