Требуется ли исходный код для создания оболочки .NET? - PullRequest
0 голосов
/ 30 октября 2019

Требуется ли исходный код C ++ для создания оболочки .NET или статических библиотек * Достаточно ли 1001 * файлов?

Мы планируем использовать SWIG .

Спасибо.

1 Ответ

2 голосов
/ 30 октября 2019

в связи с вашим вопросом, касающимся конкретно статических библиотек *.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 )
...