C++ Birlikte Çalışabilirliği Kullanma (Örtük PInvoke)

Diğer .NET dillerinden farklı olarak, Visual C++'ın yönetilen ve yönetilmeyen kodların aynı uygulamada ve hatta aynı dosyada olmasına izin veren (managed, unmanaged pragmalarıyla birlikte) birlikte çalışabilirlik desteği vardır.Bu Visual C++ geliştiricilerinin .NET özelliklerini var olan Visual C++ uygulamalarıyla uygulamaların geri kalan kısımlarını etkilemeden tümleştirmelerini sağlar.

dllexport, dllimport kullanarak yönetilen derlenecek dosyadan yönetilmeyen işlevler çağırabilirsiniz.

İşlev parametrelerinin nasıl hazırlanacağını veya DllImportAttribute açıkça çağrıldığında belirtilebilecek diğer başka detayları belirtmeniz gerekmediğinde dolaylı PInvoke kullanışlıdır.

Visual C++ yönetilen ve yönetilmeyen işlevlerin birlikte çalışması için iki yol sağlar:

Açıkça PInvoke .NET Framework tarafından desteklenir ve çoğu .NET dilinde kullanılabilir.Fakat adından da anlaşıldığı gibi, C++ Birlikte Çalışabilirliği Visual C++'a özeldir.

C++ Birlikte Çalışma

C++ Birlikte Çalışabilirliği açıkça PInvoke'ta önerilir çünkü, daha iyi tür uyumluluğu sağlar, genellikle uygulaması daha az bıktırıcıdır, yönetilmeyen API değiştirildiğinde daha hoş görülüdür ve açıkça PInvoke'ta mümkün olmayan başarım yükseltmelerini mümkün yapar.Ancak, yönetilmeyen kaynak kod kullanılabilir değilse veya /clr:safe ile derlerken, C++ Birlikte Çalışabilirliği mümkün değildir (daha fazla bilgi için bkz. Saf ve Doğrulanabilen Kod (C++/CLI)).

C++ COM Birlikte Çalışabilirliği

Visual C++'ın desteklediği birlikte çalışabilirlik özelliği, COM bileşenleriyle birlikte çalışmaya gelince, diğer .NET dillerine göre belirgin bir avantaj sunar..NET Framework Tlbimp.exe (Tür Kitaplığı İçeri Aktarıcı) kısıtlamalarıyla sınırlandırılmak yerine, veri türleri için sınırlı destek ve her COM arayüzünün her üyesine maruz kalma zorunluluğu gibi, C++ Birlikte Çalışabilirliği COM bileşenlerine isteğe bağlı erişime izin verir ve ayrı birlikte çalışabilirlik derlemesi gerektirmez.Daha fazla bilgi için bkz. Using COM from .NET.

Blittable Türleri

Basit, ön tanımlı türleri kullanan yönetilmeyen API'lar için (bkz. Blok Halinde Kopyalanabilir ve Kopyalanamaz Türler) özel kodlama gerekli değildir çünkü, bu veri türleri bellekte aynı gösterime sahiptir ancak, daha karmaşık veri türleri açıkça veri hazırlama gerektirir. Örnek için bkz. Nasıl yapılır: Yönetilen Koddan PInvoke Kullanarak 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");
}
  

Bu Bölümde

Birlikte çalışabilirlik senaryosunda temsilcileri kullanmayla ilgili bilgi için, bkz. temsilci (C++ Bileşen Uzantıları).

Ayrıca bkz.

Kavramlar

Yönetilen Koddan Yerel İşlevleri Çağırma