DllImporta una DLL c ++ in un'app C #, BYTE * p
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?
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: