DllImport eine C ++ DLL in eine C # -Anwendung, BYTE * p
Frage
Ich habe eine exportierte Funktion in einem C ++ DLL
// C++ DLL (Blarggg.dll)
extern "C"
{
USHORT ReadProperty( BYTE * messsage, USHORT length, BYTE * invokeID )
{
if( invokeID != NULL ) {
* invokeID = 10 ;
}
return 0;
}
}
Das möchte ich es zu meiner C # Anwendung zur Verfügung stellen
// 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
}
Das Problem ist, dass ich die folgende Fehlermeldung erhalte.
Eine unhanded Ausnahme des Typs 'System.NullReferenceException' aufgetreten in Blarggg.dll Weitere Informationen: Objektverweis nicht auf eine Instanz eines Objekts festgelegt.
Ich verwende VS2008 sowohl die DLL und die C # Anwendung zu erstellen.
Ich bin kein C # Programmierer.
Was mache ich falsch?
Lösung
ich Ihren Code direkt in VS2008 eingefügt und es läuft perfekt auf meinen 32-Bit-Rechnern (hinzugefügt, um eine DEF-Datei den exportierten Namen gesetzt). Ist Ihre C ++ Bibliothek auf jeden Fall ein reines win32-Projekt? Die Fehlermeldung Sie gab scheint zu implizieren, dass es eine CLR-Ausnahme ausgelöst hat.
Andere Tipps
Versuchen Sie folgendes:
[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 );
}