в связи с вашим вопросом, касающимся конкретно статических библиотек *.lib
:
Требуется ли исходный код C ++ для сборки оболочки .NET или статических библиотек * .lib-файлов достаточно?
Я сомневаюсь, что вы на самом деле намереваетесь обернуть static-lib: статически связанные библиотеки, как правило, не распространяются и не переносимы (например, авторам статических библиотек с закрытым исходным кодом необходимо создавать их каждый раз, когда приходит новый поддерживаемый компиляторнапример, вы не можете использовать библиотеку GCC с VisualC ++ 2017, а библиотека x64 VisualC ++ 2017 не будет совместима с проектом x86 VisualC ++ 2015) - и даже если вы загрузили *.lib
в память вашего процесса и перепрыгнулина известный адрес функции внутри образа библиотеки, он сразу же прервется, потому что код статической библиотеки будет иметь ссылки на определенные адреса памяти (например, строковые константы) , которые еще не перемещены - вы получитесбой segfault (или «Нарушение прав доступа» в Windows), если вам повезло (если нет, это определитповреждать пространство памяти вашего процесса перед его обнаружением).
P / Invoke в .NET Framework и .NET в Windows (т. е. используя [DllImport]
) поддерживает только библиотеки DLL (динамически связанные библиотеки), а не статически связанныебиблиотеки.
Вы также можете обращаться к собственному коду, если нативный код доступен как COM-объект, или к нему можно получить доступ с помощью функций платформы, таких как OLE, WMIC, ADSI и т. д. (при условии, что процесс вашего кода такой же ISAкак собственный код, который вы хотите вызвать, так как он все равно будет загружен в ваш процесс, поэтому вы не можете использовать 64-битный Office Excel для открытия баз данных, где доступен только 32-битный драйвер OLE-DB или ODBC).
Когда библиотека доступна как *.lib
, вам сначала нужно создать собственный собственный хост - простой C / C ++ Win32 (PE) EXE или DLL, который реэкспортирует все полезные функции изчто *.lib
будет достаточно - потому что тогда эти экспорты могут быть импортированы C # /. NET.
Но в целом:
- Если вы экспортируете COM-объектs. .NET, то вам не нужны ни файлы исходного кода (
*.c
, *.cpp
), ни файлы заголовков (*.h
и *.hpp
), только файлы IDL или *.tlb
(Type-lib)), который сгенерирует для вас компилятор. - Если ваш собственный код также доступен через другие функции платформы, такие как OLE, ActiveX, COM Automation (
IDispatch
), ODBC, OLE-DB, ADSI, WMI и т. д. тогда вы не будете использовать [DllImport], и все эти платформы предоставляют стандартный интерфейс (например, ODBC и OLE-DB) - Но, вообще говоря, нет - вам не нужен исходный код (т.е. файлы
*.c
и *.h
) для создания оболочки .NET вокруг собственного кода, экспортированного из собственной библиотеки DLL и импортированного в .NET с использованием [DllImport]
. - Но вам понадобятся заголовочные файлы (
*.h
) из проекта C / C ++ в дополнение к знанию настроек компилятора (для выяснения таких вещей, как соглашение о вызовах, информация о маршалинге параметрови т. д.) и инспектор PE (чтобы убедиться, что экспортированные функции по крайней мере присутствуют в той DLL, которую вы хотите загрузить).
- Не забудьте убедиться, что вы предоставили как x86, так и x64встроенные библиотеки DLL для всех функций, если вы компилируете код C # / .NET для
AnyCPU
(совет: Использование 32-битных или 64-битных dll в C # DllImport )