DllImporta una DLL de c ++ en una aplicación de C #, BYTE * p
Pregunta
Tengo una función exportada en una DLL de c ++
// C++ DLL (Blarggg.dll)
extern "C"
{
USHORT ReadProperty( BYTE * messsage, USHORT length, BYTE * invokeID )
{
if( invokeID != NULL ) {
* invokeID = 10 ;
}
return 0;
}
}
Que me gustaría que esté disponible para mi aplicación C #
// C# app
[DllImport("Blarggg.dll")]
public static extern System.UInt16 ReadProperty(
/* [OUT] */ System.Byte[] message,
/* [IN] */ System.UInt16 length,
/* [OUT] */ System.Byte[] invokeID );
private void DoIt()
{
System.Byte[] message = new System.Byte[2000];
System.Byte[] InvokeID = new System.Byte[1];
System.UInt16 ret = ReadProperty( message, 2000, InvokeID ); // Error
}
El problema es que sigo recibiendo el siguiente mensaje de error.
Se produjo una excepción no controlada del tipo 'System.NullReferenceException' en Blarggg.dll Información adicional: Referencia de objeto no establecida en una instancia de un objeto.
Estoy usando VS2008 para compilar tanto la DLL como la aplicación C #.
No soy un programador de C #.
¿Qué estoy haciendo mal?
Solución
Pegué su código directamente en VS2008 y se ejecuta perfectamente en mi máquina de 32 bits (agregue un archivo .def para establecer el nombre exportado). ¿Es su biblioteca de C ++ definitivamente un proyecto win32 puro? El mensaje de error que dio parece implicar que lanzó una excepción CLR.
Otros consejos
Prueba esto:
[DllImport("Blarggg.dll", CallingConvention := CallingConvention.Cdecl)]
public static extern System.UInt16 ReadProperty(
/* [IN] */ System.Byte[] message,
/* [IN] */ System.UInt16 length,
/* [OUT] */ out System.Byte invokeID );
private void DoIt()
{
System.Byte[] message = new System.Byte[2000];
System.Byte InvokeID;
System.UInt16 ret = ReadProperty( message, 2000, out InvokeID );
}
Es posible que deba usar System.Runtime.InteropServices.Marshal class para convertir entre tipos administrados y no administrados.
¿Puedes hacer esto con los tipos de C ++?
Tenía la impresión de que solo podías DLLImport C DLL.
Usamos DLLImport con C ++ Dll muy bien, pero declaramos nuestras funciones externas como
extern "C" __declspec(dllexport) ...
Eche un vistazo a esta página web: