Za pomocą Interop C++ (niejawna PInvoke)
W odróżnieniu od innych.NET języków Visual C++ obsługuje współdziałania umożliwiający kod zarządzany i niezarządzany istnieją w tej samej aplikacji, a nawet w tym samym pliku (z managed, unmanaged pragmas).Pozwala to programistom Visual C++.NET funkcjonalności do istniejących aplikacji Visual C++, bez naruszania reszty aplikacji.
Można również wywołać funkcji niezarządzanego z compiland zarządzanych za pomocą dllexport, dllimport.
Niejawne PInvoke jest przydatne, nie jest konieczne określenie sposobu organizowane parametrów funkcji lub dowolne inne szczegóły, które można określić, kiedy jawne wywołanie DllImportAttribute.
Visual C++ oferuje dwa sposoby funkcje zarządzanych i niezarządzanych do współpracy:
Jawne PInvoke jest obsługiwany przez.NET Framework i jest dostępna w większości.Języki netto.Ale jak sugeruje jego nazwa, C++ Interop jest specyficzne dla języka Visual C++.
C++ Interop
Za pośrednictwem jawnych PInvoke zaleca się C++ Interop, ponieważ zapewnia lepsze bezpieczeństwo typu, jest zazwyczaj mniej kłopotliwe do wykonania, jest bardziej forgiving, jeśli niezarządzanego API jest modyfikowany i sprawia, że ulepszenia wydajności jest możliwe, że nie są możliwe przy jawne PInvoke.Jednakże C++ Interop nie jest możliwe Jeśli kod niezarządzany źródłowy nie jest dostępna lub podczas kompilacji z /clr:safe (zobacz Kod czystej i zweryfikowania (C + +/ CLI) Aby uzyskać więcej informacji).
C++ com.
Funkcji współdziałania obsługiwanych przez program Visual C++ oferuje szczególną korzyść w stosunku do innych.NET języków pochodzi współdziałanie ze składnikami COM.Zamiast ograniczone jest do ograniczenia.NET Framework Tlbimp.exe (Importer biblioteki typów), takich jak ograniczona obsługa typów danych i obowiązkowe narażenia każdego członka każdego interfejsu COM C++ Interop pozwala składników COM można uzyskać dostęp z życzeniem i nie wymaga interop oddzielnych zespołów.Aby uzyskać więcej informacji, zobacz Using COM from .NET.
Typy istnieć
Dla niezarządzanego interfejsów API, które używają typów prostych, wewnętrzne (zobacz Istnieć i typy niekopiowalne), nie kodowanie jest wymagane, ponieważ te typy danych mają taką samą reprezentację w pamięci, ale bardziej złożonych typów danych wymaga przekazywania międzyprocesowego jawnych danych.Przykładem, zobacz Jak: wywołanie macierzystych bibliotek DLL z kodu zarządzanego przy użyciu 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
Jak: MARSZAŁEK wywołania zwrotne i delegatów przy użyciu C++ Interop
Jak: określenie, czy obraz jest w trybie macierzystym lub CLR
Jak: Dodawanie macierzystym DLL do pamięci podręcznej zestawów globalnych
Jak: przytrzymaj odwołanie do obiektu w pamięci niezarządzanych
Informacji na temat używania delegatów w scenariuszu współdziałania, zobacz delegate (C++ Component Extensions).