В вашем коде C ++:
Мне всегда нужен был внешний "C".C ++ изменяет имена функций, если вы этого не делаете (искажение необходимо для поддержки перегрузки функций).Экстерьер "C" говорит ему не делать этого.
Я также объявлю функции как __stdcall.Я полагаю, что вы можете сказать C #, какой тип соглашения о вызовах использовать, но я думаю, что __stdcall используется по умолчанию.
Что касается передачи строкового объекта, я не уверен в этом, я придерживаюсь только использования примитивовдля передачи параметров, поэтому я бы использовал const char * и настроил соответственно в своем коде C ++.
Также я стараюсь избегать передачи по ссылке.Скорее, если мне нужно будет вернуть несколько значений, я настрою серию получателей для обработки этого (const char * возвращает как IntPtr).
В вашем коде C #:
Я использую String для const char *, int для int и так далее.Я полагаю, что у Microsoft есть диаграмма где-то, чтобы сказать вам, что нужно заменить для чего.
При работе с возвращаемой строкой вам необходимо преобразовать ее в ANSI.Это можно сделать с помощью вызова функции Marshal.PtrToStringAnsi ().
Например:
В моем коде C ++:
extern "C" __declspec(dllexport) const char* __stdcall GetCompany(const char *In) {
return MyGetCompany(In); // Calls the real implementation
}
Inмой код C #:
[DllImport("TheDLL.dll", EntryPoint = "GetCompany")]
private static extern IntPtr privGetCompany(String In);
// Call this one, not the one above:
public String GetProvince(String In)
{
return Marshal.PtrToStringAnsi(privGetCompany(In));
}
Последнее замечание: если вы работаете на 64-битной машине, конфигурация «Любой ЦП» сделает 64-битный исполняемый файл C #, для которого потребуется 64-бит DLL.Если у вас есть только 32-битная DLL, вам нужно добавить конфигурацию (x86).
Полученное сообщение об ошибке указывает на то, что ваша программа на C #, вероятно, правильно находит DLL и функцию,так что искажение имени вряд ли является проблемой.Похоже, проблема соглашения о вызовах или проблема с передачей параметров.