Domanda

Ho una funzione esportata in una DLL c ++

// C++ DLL (Blarggg.dll)

extern "C"
{
     USHORT ReadProperty( BYTE * messsage, USHORT length, BYTE * invokeID ) 
    {
         if( invokeID != NULL ) {
            * invokeID = 10 ; 
        }
         return 0;
    }
}

Che vorrei renderlo disponibile per la mia applicazione 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 
}

Il problema è che continuo a ricevere il seguente messaggio di errore.

  

Si è verificata un'eccezione non gestita del tipo "System.NullReferenceException" in Blarggg.dll   Ulteriori informazioni: riferimento oggetto non impostato su un'istanza di un oggetto.

Sto usando VS2008 per creare sia la DLL che l'applicazione C #.

Non sono un programmatore C #.

Cosa sto sbagliando?

È stato utile?

Soluzione

Ho incollato il tuo codice direttamente in VS2008 e funziona perfettamente sulla mia macchina a 32 bit (aggiunto un file .def per impostare il nome esportato). La tua libreria C ++ è sicuramente un progetto win32 puro? Il messaggio di errore che hai dato sembra implicare che ha generato un'eccezione CLR.

Altri suggerimenti

Prova questo:

[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 );
} 

Potrebbe essere necessario utilizzare System.Runtime.InteropServices.Marshal class per la conversione tra tipi gestiti e non gestiti.

Puoi farlo con i tipi C ++?

Avevo l'impressione che potessi solo DLLImport C dlls.

Usiamo DLLImport con C ++ Dll, ma dichiariamo le nostre funzioni esterne come

extern "C" __declspec(dllexport) ...

Dai un'occhiata a questa pagina web:

http://dotnetperls.com/dllimport-interop

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top