dllимпортировать библиотеку DLL c ++ в приложение C #, БАЙТ * p
Вопрос
У меня есть экспортированная функция в 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) ...
Взгляните на эту веб-страницу: