dllимпортировать библиотеку DLL c ++ в приложение C #, БАЙТ * p

StackOverflow https://stackoverflow.com/questions/1603834

  •  05-07-2019
  •  | 
  •  

Вопрос

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

// 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 #.

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

Это было полезно?

Решение

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

Другие советы

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

[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 );
} 

Возможно, вам придется использовать Система.Среда выполнения.Службы взаимодействия.Класс маршала для преобразования между управляемыми и неуправляемыми типами.

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

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

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

extern "C" __declspec(dllexport) ...

Взгляните на эту веб-страницу:

http://dotnetperls.com/dllimport-interop

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top