Созданный основной C++ DLL и экспортируемые имена с помощью файла Определения Модуля (MyDLL.def). После компиляции я проверяю экспортируемое использование имен функций dumpbin.exe
Я ожидаю видеть:
SomeFunction
но я вижу это вместо этого:
SomeFunction = SomeFunction@@@23mangledstuff#@@@@
Почему?
Экспортируемая функция кажется неукрашенной (особенно по сравнению с не использованием файла Определения Модуля), но что произошло с другим материалом?
Если я использую dumpbin.exe
против DLL из любого коммерческого применения Вы получаете чистое:
SomeFunction
и ничто иное...
Я также пытался удалить Определение Модуля и экспортировать имена с помощью "C" стиля экспорта, а именно:
extern "C" void __declspec(dllexport) SomeFunction();
(Просто использование "экстерна "C" не создало экспортируемую функцию),
Однако это все еще создает тот же вывод, а именно:
SomeFunction = SomeFunction@@@23mangledstuff#@@@@
Я также попробовал #define dllexport __declspec(dllexport)
опция и созданный LIB без проблемы. Однако я не хочу должным быть предоставлять Библиотечный файл людям, использующим DLL в их приложении C#.
Это - простой ванильный C++ DLL (неуправляемый код), скомпилированный с C++ только простой заголовок и код. Без Определения Модуля я получаю искаженные экспортируемые функции (я могу создать статическую библиотеку и использовать LIB без проблем. Я стараюсь избегать этого). Если я использую extern "C" __declspec(dllexport)
ИЛИ Определение Модуля, я получаю, что, кажется, неукрашенное имя функции... единственная проблема состоит в том, что оно сопровождается "=" и что похоже на украшенную версию функции. Я хочу избавиться от материала после "=" - или по крайней мере понять, почему это там.
В настоящий момент я вполне уверен, что я могу вызвать функцию от C# с помощью P/Invoke... Я просто хочу избежать что спам в конце "=".
Я открыт для предложений о том, как изменить проект/параметры компилятора, но я просто использовал стандартный шаблон Visual Studio DLL - ничто специальное.
Вы можете добиться желаемого, отключив генерацию отладочной информации. Project + Properties, Linker, Debugging, Generate Debug Info = No.
Естественно, вы хотите сделать это только для сборки Release. Где эта опция уже установлена.
Вместо использования файла .def просто вставьте pragma comment
вот так
#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
Edit: Или еще проще: Внутри тела функции используйте
#pragma comment(linker, "/EXPORT:"__FUNCTION__"="__FUNCDNAME__)
. ... . если вам трудно найти украшенное имя функции. Эта последняя прагма может быть еще более сокращена с помощью простого макроопределения.
Вы должны объявить функции как extern "C"
, если не хотите, чтобы их имена были искажены.
функция SomeFunction@@@23mangledstuff#@@@@ искажается, чтобы дать типы и класс функции C++. Простой экспорт - это функции, которые могут быть вызваны из Си, т.е. написаны на Си или объявлены как extern "C" в коде Си++. Если вы хотите простой интерфейс, то вам нужно сделать так, чтобы экспортируемые функции использовали только типы C и сделать их функциями-нечленами в глобальном пространстве имен.
В основном, когда вы используете функции в C++, части их имен теперь включают их сигнатуру и тому подобное, чтобы облегчить такие возможности языка, как перегрузка.
Если вы пишете DLL, используя __declspec(dllexport), то она также должна создавать lib. Соединитесь с этой библиотекой, и вы автоматически соединитесь с ней, а функции будут зарегистрированы CRT во время запуска (если вы не забыли изменить все импорты на экспорты). Вам не нужно знать об объединении имен, если вы используете эту систему.