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

Birlikte çalışma senaryosunda temsilcileri kullanma hakkında bilgi için bkz . temsilci (C++ Bileşen Uzantıları).

Ayrıca bkz.