Вызовы веб-службы C # WCF для C DLL

#c# #wcf #visual-c #dllimport

#c# #wcf #visual-c #dllimport

Вопрос:

Существует устаревшая библиотека DLL C , созданная в Visual Studio 2015, и я работаю над предоставлением некоторых функций C в качестве REST API. Для этой цели создал проект веб-сервера WCF в том же решении и пытаюсь вызвать функции C через DllImport.

 [DllImport("ExtOutPutGenerator.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern int CreateFrameGenerators(string node, string axis);
  

В коде C вышеупомянутая функция объявлена как,

 extern "C" __declspec(dllexport) int CreateFrameGenerators(const char* node, const char* axis);
  

Теперь, когда я вызываю функцию C через DllImport, она не работает.

то есть, когда я вызываю REST API через браузер, он выдает следующее сообщение.

 The server encountered an error processing the request. See server logs for details.
  

Я точно знаю, что сбой происходит при вызове функции C изнутри C #. Не уверен, где найти журнал сервера.

В целях тестирования я создал образец C test DLL в том же решении, а затем вызвал его функцию через DllImport, и это работает нормально.

Похоже, проблема связана с устаревшей C DLL.

Я понятия не имею, что еще искать или как устранить неполадки.

Итак, мой вопрос,

  1. В чем может быть проблема с устаревшей C DLL, которая вызывает эту проблему? Какие-либо конкретные настройки проекта?

  2. Есть ли другой способ добиться этого без использования DllImport? Что-нибудь более простое и чистое, что могло бы работать во всех проектах C ?

Комментарии:

1. Приведенный вами здесь код в порядке. Нам нет смысла гадать. Вам нужно выполнить отладку. Начните с журналов.

Ответ №1:

Предполагая, что вы правильно выполнили всю часть кодирования, другая важная вещь, которую следует проверить, — это целевая платформа. Оба C и C # должны быть созданы для одной платформы.

Например, если для C DLL установлено значение x64, то C # также должен быть собран с использованием x64.

Комментарии:

1. Это помогло! C был x64, а C # был настроен на AnyCPU. Как только C # был установлен на x64, все работало как по маслу.