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?

Était-ce utile?

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:

http://dotnetperls.com/dllimport-interop

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top