DllImporter une DLL c ++ dans une application C #, BYTE * p
Question
J'ai une fonction exportée dans une DLL c ++
// C++ DLL (Blarggg.dll)
extern "C"
{
USHORT ReadProperty( BYTE * messsage, USHORT length, BYTE * invokeID )
{
if( invokeID != NULL ) {
* invokeID = 10 ;
}
return 0;
}
}
Je voudrais le rendre disponible pour mon application 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
}
Le problème est que je continue à recevoir le message d'erreur suivant.
Une exception non gérée du type 'System.NullReferenceException' s'est produite dans Blarggg.dll Informations complémentaires: La référence à l'objet n'est pas définie sur une instance d'objet.
J'utilise VS2008 pour générer à la fois l'application DLL et l'application C #.
Je ne suis pas un programmeur C #.
Qu'est-ce que je fais de travers?
La solution
J'ai collé votre code directement dans VS2008 et il fonctionne parfaitement sur mon ordinateur 32 bits (j'ai ajouté un fichier .def pour définir le nom exporté). Votre bibliothèque C ++ est-elle définitivement un projet Win32 pur? Le message d'erreur que vous avez donné semble impliquer qu'il a généré une exception CLR.
Autres conseils
Essayez ceci:
[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 );
}
Vous devrez peut-être utiliser Classe System.Runtime.InteropServices.Marshal pour la conversion entre types gérés et non gérés.
Pouvez-vous faire cela avec des types C ++?
J'avais l'impression que vous ne pouviez que DLLImport C dlls.
Nous utilisons DLLImport avec C ++ Dll, mais nous déclarons nos fonctions externes comme
extern "C" __declspec(dllexport) ...
Consultez cette page Web: