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?

Foi útil?

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:

http://dotnetperls.com/dllimport-interop

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top