Udostępnij za pośrednictwem


Korzystanie z międzyoperacyjności języka C++ (niejawna funkcja PInvoke)

W przeciwieństwie do innych języków .NET, Visual C++ obsługuje współdziałania umożliwiający kod zarządzany i niezarządzany istnieć w tej samej aplikacji, a nawet w tym samym pliku (z zarządzane, niezarządzane pragmy).Pozwala to programistom Visual C++ zintegrować istniejących aplikacji Visual C++ .NET funkcjonalność bez naruszania reszty aplikacji.

Można również wywołać funkcji niezarządzanych zarządzanych compiland, w którym używana jest dllexport, dllimport.

Niejawna PInvoke jest przydatne, gdy nie trzeba określić, jak będą przekazywane parametry funkcji lub dowolne inne szczegóły, które można określić podczas jawne wywołanie DllImportAttribute.

Visual C++ oferuje dwa sposoby zarządzany i niezarządzany funkcje do współpracy:

Jawne PInvoke jest obsługiwany przez.NET Framework i jest dostępny w większości języków .NET.Ale jak sugeruje jego nazwa, C++ Interop jest specyficzne dla języka Visual C++.

C ++ Interop

C ++ Interop zaleca się nad PInvoke jawnej, ponieważ zapewnia lepsze zabezpieczenia typów, jest zazwyczaj mniej uciążliwe do wdrożenia, odpowiedniejsza, jeśli niezarządzanych API jest modyfikowany i sprawia, że możliwy ulepszeniami wydajności, które nie są możliwe z jawne PInvoke.C ++ Interop nie jest jednak możliwe jeśli kod niezarządzany źródłowy nie jest dostępny lub podczas kompilacji z /clr:safe (patrz Kod czysty i weryfikowalny (C++/CLI) uzyskać więcej informacji).

Usługa międzyoperacyjna modelu COM C++

Funkcji współdziałania, obsługiwanych przez program Visual C++ oferują szczególnie korzystne w innych językach .NET, jeśli chodzi o współdziałania ze składnikami COM.W przeciwieństwie do ograniczeń.NET Framework Tlbimp.exe (Importer biblioteki typów), takich jak ograniczoną obsługę dla typów danych i obowiązkowe narażenia każdego członka każdego interfejsu COM C++ Interop zezwala składnikom COM można uzyskać dostęp do woli i nie wymaga zestawy międzyoperacyjne oddzielne.Aby uzyskać dodatkowe informacje, zobacz Using COM from .NET.

Typów istnieć

Dla niezarządzanego interfejsów API, które typy proste, wewnętrzne (zobacz Typy kopiowalne i niekopiowalne), nie ma kodowania jest wymagane, ponieważ te typy danych mają taką samą reprezentację w pamięci, ale bardziej złożone typy danych wymagają jawne dane organizacyjne.Aby zobaczyć przykład, zobacz Porady: wywoływanie natywnych bibliotek DLL z kodu zarządzanego za pomocą funkcji PInvoke.

Przykład

// 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");
}
  

W tej sekcji

Informacje na temat używania delegatów w scenariuszu współdziałania, zobacz Pełnomocnik.

Zobacz też

Koncepcje

Wywoływanie funkcji natywnych z kodu zarządzanego