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?

¿Fue útil?

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:

http://dotnetperls.com/dllimport-interop

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top