DLL DllImport um c ++ em um aplicativo C #, BYTE * p
Pergunta
Eu tenho uma função exportada em um c ++ DLL
// C++ DLL (Blarggg.dll)
extern "C"
{
USHORT ReadProperty( BYTE * messsage, USHORT length, BYTE * invokeID )
{
if( invokeID != NULL ) {
* invokeID = 10 ;
}
return 0;
}
}
Que eu gostaria de torná-lo disponível para o meu aplicativo 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
}
O problema é que eu continuo recebendo a seguinte mensagem de erro.
Uma exceção unhanded do tipo 'System.NullReferenceException' ocorreu no Blarggg.dll Informação adicional: objecto de referência não definida para uma instância de um objecto.
Eu estou usando VS2008 para construir tanto a DLL eo aplicativo C #.
Eu não sou um programador C #.
O que estou fazendo de errado?
Solução
Eu colei o código diretamente no VS2008 e funciona perfeitamente em minha máquina de 32 bits (adicionado um arquivo .def para definir o nome exportado). É a sua biblioteca C ++ definitivamente um projeto win32 pura? A mensagem de erro que você deu parece implicar que ele jogou uma exceção CLR.
Outras dicas
Tente isto:
[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 );
}
Você pode precisar usar o System.Runtime.InteropServices.Marshal classe para converter entre os tipos gerenciados e não gerenciados.
Você pode fazer isso com tipos C ++?
Eu estava sob a impressão de que você só poderia dlls DLLImport C.
Nós usamos DLLImport com apenas fina do C ++ DLL mas declaramos que nossas funções externas como
extern "C" __declspec(dllexport) ...
Tenha uma olhada nesta página web: