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
Porady: kierowanie ciągów ANSI za pomocą międzyoperacyjności języka C++
Porady: kierowanie ciągów Unicode za pomocą międzyoperacyjności języka C++
Porady: kierowanie ciągów COM za pomocą międzyoperacyjności języka C++
Porady: kierowanie struktur za pomocą międzyoperacyjności języka C++
Porady: kierowanie tablic za pomocą międzyoperacyjności języka C++
Porady: kierowanie wywołań zwrotnych i delegatów za pomocą międzyoperacyjności języka C++
Porady: kierowanie wskaźników osadzonych za pomocą międzyoperacyjności języka C++
Porady: konwertowanie obiektu System::String na ciąg wchar_t* lub char*
Porady: konwertowanie obiektu System::String na ciąg standardowy
Porady: konwertowanie ciągu standardowego na obiekt System::String
Porady: ładowanie zasobów niezarządzanych do tablicy typu Byte
Porady: dodawanie natywnej biblioteki DLL do globalnej pamięci podręcznej zestawów
Porady: utrzymywanie odwołania do typu wartości w typie natywnym
Porady: utrzymywanie odwołania do obiektu w pamięci niezarządzanej
Porady: konwertowanie między identyfikatorami System::Guid i _GUID
Informacje na temat używania delegatów w scenariuszu współdziałania, zobacz Pełnomocnik.