Как правильно создать точку входа на внешний ресурс .dll, написанный на C ++, используемый в C # - PullRequest
0 голосов
/ 15 января 2011

Долгое время читатель, первый постер.Однажды я надеюсь ответить на вопросы здесь ...

Так что это похоже на: "Невозможно найти точку входа с именем [function] в dll" (преобразование типов c ++ в c #)

Но я не могу применить то же решение ...

По сути, я написал новый метод:

Определено в заголовочном файлеПроект C ++ как:

extern "C" {
     __declspec(dllexport) bool IsDataValid();
}

Определен в исходном файле проекта C ++ как: (только подпись)

extern bool __cdecl IsDataValid() { 
//function stuf......... returns a bool
}

Импортирован в приложение форм C # в проекте C # как:

[DllImport("CarChipSDK_C_Sharp.dll", EntryPoint = "IsDataValid")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsDataValid();

Вызывается из того же места в файле C # форм .cs, что и:

bool isDataValid = IsDataValid();

Возвращается исключение с сообщением:

"Не удалось найти точку входа 'IsDataValid ()', названную в DLL 'CarChipSDK_C_Sharp.dll'.

Я использовал dumpbin.exe и средство обхода зависимостей для DLL-файла, сгенерированного из кода c ++, и онопоказывает, что у него есть точка входа IsDataValid ().

Вся помощь очень ценится ...

Проблема решена!Глупо, это был код из предыдущего кооператива в моей нынешней компании, оказалось, что он читал .dll из папки bin / release, где я собирался в папку bin / debug.Должен был знать.Мои искренние извинения.

1 Ответ

8 голосов
/ 15 января 2011

Вы столкнулись с искажением имен в C ++. Объявите функции C ++ как внешние "C". Итак, в вашем модуле C ++ ...

extern "C" __declspec(dllexport) bool IsDataValid();

Вам действительно не нужен атрибут спецификации точки входа. Ваша декларация C # будет:

[DllImport("CarChipSDK_C_Sharp.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsDataValid();

Для дальнейшего использования dumpbin.exe - очень полезная программа для анализа подобных проблем. Если вы запустите ее в своей DLL, вы увидите, какие имена на самом деле называются этими функциями к моменту их компиляции.

...