DllImport c ++ DLL в приложение C #, BYTE * p - PullRequest
2 голосов
/ 22 октября 2009

У меня есть экспортируемая функция в DLL-библиотеке c ++

// C++ DLL (Blarggg.dll)

extern "C"
{
     USHORT ReadProperty( BYTE * messsage, USHORT length, BYTE * invokeID ) 
    {
         if( invokeID != NULL ) {
            * invokeID = 10 ; 
        }
         return 0;
    }
}

То, что я хотел бы сделать его доступным для моего приложения 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 
}

Проблема в том, что я получаю следующее сообщение об ошибке.

Произошло неискаженное исключение типа «System.NullReferenceException» в Blarggg.dll Дополнительная информация: ссылка на объект не установлена ​​для экземпляра объекта.

Я использую VS2008 для сборки приложений DLL и C #.

Я не программист на C #.

Что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 22 октября 2009

Попробуйте это:

[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 );
} 
2 голосов
/ 22 октября 2009

Я вставил ваш код прямо в VS2008, и он отлично работает на моей 32-битной машине (добавлен файл .def для установки экспортированного имени). Ваша библиотека C ++ определенно является чистым проектом win32? Похоже, что сообщение об ошибке означает, что оно вызвало исключение CLR.

0 голосов
/ 22 октября 2009

Можете ли вы сделать это с типами C ++?

У меня сложилось впечатление, что вы можете только DLLImport C dll.

Мы используем DLLImport с C ++ Dll, но мы объявляем наши внешние функции как

extern "C" __declspec(dllexport) ...

Посмотрите на эту веб-страницу:

http://dotnetperls.com/dllimport-interop

0 голосов
/ 22 октября 2009

Вам может понадобиться использовать System.Runtime.InteropServices.Marshal класс для преобразования между управляемым и неуправляемым типами.

...