Exportar (0) Imprimir
Expandir todo
Expandir Minimizar
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original
Este tema aún no ha recibido ninguna valoración - Valorar este tema

Utilizar la interoperabilidad de C++ (PInvoke implícito)

A diferencia de otros lenguajes de .NET, Visual C++ cuenta con compatibilidad de interoperabilidad que permite que haya código administrado y no administrado en la misma aplicación, e incluso en el mismo archivo (con las directivas pragma managed, unmanaged). De este modo, los desarrolladores de Visual C++ pueden integrar la funcionalidad de .NET en las aplicaciones de Visual C++ existentes sin que esto afecte al resto de la aplicación.

También se puede llamar a funciones no administradas desde una operación de compilación administrada mediante dllexport, dllimport.

PInvoke implícito es útil cuando no es necesario especificar cómo se van a calcular las referencias de los parámetros de una función ni cualquiera de los otros detalles que se pueden especificar cuando se llama explícitamente a DllImportAttribute.

Visual C++ proporciona dos formas de interoperabilidad para las funciones administradas y no administradas:

.NET Framework admite PInvoke explícito, que está disponible en la mayoría de los lenguajes de .NET. Pero, como su propio nombre indica, la interoperabilidad de C++ es específica de Visual C++.

La interoperabilidad de C++ es preferible a PInvoke explícito porque proporciona mejor seguridad de tipos, suele ser menos tediosa de implementar, es más tolerante a las modificaciones de la API no administrada y permite mejoras en el rendimiento que no son posibles con PInvoke explícito. Sin embargo, la interoperabilidad de C++ no es posible si el código fuente no administrado no está disponible o cuando se compila con /clr:safe (vea Código puro y comprobable (C++/CLI) para obtener más información).

Las características de interoperabilidad admitidas por Visual C++ ofrecen una ventaja concreta con respecto a otros lenguajes de .NET en lo que se refiere a la interoperabilidad con componentes COM. En lugar de limitarse a las restricciones del TlbImp.exe (Importador de la biblioteca de tipos) de .NET Framework, como la compatibilidad limitada para tipos de datos y la exposición obligatoria de cada miembro de cada interfaz COM, la interoperabilidad de C++ permite el acceso a voluntad a componentes COM y no requiere ensamblados de interoperabilidad independientes. Para obtener más información, vea Using COM from .NET.

Para las API no administradas que usan tipos intrínsecos simples (vea Tipos que pueden o que no pueden transferirse en bloque de bits), no se requiere una codificación especial porque estos tipos de datos tienen la misma representación en memoria, pero los tipos de datos más complejos requieren el cálculo de referencias de datos explícito. Para obtener un ejemplo, vea Cómo: Llamar a archivos DLL nativos desde el código administrado mediante PInvoke.

// 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");
}
Sonido de inicio
Listo

Para obtener información sobre cómo utilizar delegados en un escenario de interoperabilidad, vea delegate (Extensiones de componentes de C++).

¿Te ha resultado útil?
(Caracteres restantes: 1500)
Gracias por sus comentarios

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft. Reservados todos los derechos.