2017-01-09 2 views
0

У меня есть nuget, образованный из проекта C++ - внутри этого nuget У меня есть extern-метод GetBytes внутри статического класса FileAccess.cs, который я вызываю в вызове службы REST другого проекта (C#) получить некоторые данные. Всякий раз, когда я вызываю этот метод GetBytesextern из моей службы REST C#, я почему-то получаю AccessViolationException. Метод принимает две строки и несколько значений int и возвращает IntPtr.AccessViolationException при вызове метода extern напрямую

Я смущен, потому что у меня есть аналогичный вызов, который не приводит к нарушению. Главное отличие заключается в том, что эта версия не вызывает метод extern напрямую. Вместо этого он вызывает класс C# DataGroup (который является частью nuget), который содержит функцию, вызывающую метод extern. Метод класса DataGroup возвращает byte[,], но только после того, как он вызывает метод extern и маршалы данных.

// Версия в результате AccessViolation:

  1. REST вызова экстерном метод как IntPtr (IntPtr ptr = FileAccess.getBytes(...);
  2. экстерном метод возвращает IntPtr
  3. AccessViolationException происходит

// Рабочая версия с дополнительный класс:

  1. REST вызов метода группы данных, который возвращает byte[,]. (Например, dataGroupInstance.getDataGroupBytes();
  2. ехЬегп метод вызывается внутри метода getDataGroupBytes
  3. ехЬегп метод возвращает метод IntPtr
  4. getDataGroupBytes маршалов данные из IntPtr и возвращает не byte[,]
  5. никакой ошибки

В принципе, почему вызвав метод extern, непосредственно приводящий к AccessViolationException?

+0

Если ваш 'FileAccess.getBytes (...);' метод принимает varargs, убедитесь, что вы установили 'CallingConvention.Cdecl' на подпись PInvoke. – Peter

ответ

0

Выяснил это. Проблема была связана с моими параметрами - мои функции C++ использовали std::string, когда я должен был использовать const char*. Я заменил все экземпляры std::string (где они были использованы как параметры) с const char*, и я больше не получал исключения.

Смежные вопросы