Как бы я использовал DLL C ++ / CLI, которая обертывает нативный код с несколькими зависимыми библиотеками в C #? - PullRequest
0 голосов
/ 21 июля 2010

Мне интересно, как бы я правильно настроить библиотеку C ++ / CLI, которая оборачивает собственный код C ++, имеющий несколько зависимостей. Я безуспешно пытался статически и динамически связать нативную библиотеку с зависимыми библиотеками.

Managed C ++ / CLI dll собирается просто отлично и может быть добавлен как ссылка на проект C #. Однако, когда я пытаюсь использовать любой из определенных классов, я получаю либо BadImageFormatException, либо FileNotFoundException, в зависимости от того, как я связался. Я считаю, что мне нужно указать зависимые библиотеки в библиотеке CLI, чтобы она загружалась в манифест, но я не уверен в этом процессе. Кроме того, поскольку я знаю, что это произойдет, я убедился, что все задействованные библиотеки построены на архитектуре x86.

Ответы [ 3 ]

2 голосов
/ 22 июля 2010

Я разобрался с проблемой, и теперь все работает правильно.Это была комбинация нескольких неправильных вещей, происходящих вместе.

Если у кого-то есть такая же проблема, я решил ее, настроив следующее:

1) Библиотеки Boost, на которые ссылались (в частности,boost_thread) необходимо скомпилировать с препроцессором BOOST_THREAD_USE_DLL (другие библиотеки boost могут нуждаться в BOOST_ALL_DYN_LINK, чтобы просто динамически связывать все).Это, по-видимому, общая проблема.

2) Я проверил, что все зависимости были в системном пути (как повторил R Ubben)

3) Я использовал DependencyWalker (зависит от.exe от sourceforge), чтобыпроанализировать мою скомпилированную управляемую DLL.Оказалось, что используемая библиотека libpq.lib фактически ссылалась на дополнительные библиотеки DLL, которые не были включены в папку lib, а в папку bin.Так что это нужно добавить в путь.

4) Часть моей обертки использовала заголовок #include для списков.Это заставило мою библиотеку связываться с зависимыми от фреймворка библиотеками 2.0.Это было несовместимо с моим приложением C #, ориентированным на клиента.Это стало известно только при разборе предупреждений от компиляции (ранее скрытой из-за того, что C ++ генерировал слишком много ... глупо, я знаю).Однако это приводило к возникновению исключения System.BadImageFormateException, несмотря на то, что все предназначалось для той же архитектуры x86.

Надеюсь, что это поможет всем, у кого есть такая же проблема.BadImageFormateException и FileNotFoundException были слишком расплывчаты и бесполезны.

0 голосов
/ 21 июля 2010

Я получил эту ошибку, когда зависимые библиотеки не были в пути.Библиотека обертки найдена из-за ссылки, но ссылка также не заботится о зависимых библиотеках.Попробуйте разместить их явно там, где выполняется программа.

0 голосов
/ 21 июля 2010

Вы должны сделать C ++ dll в режиме выпуска и использовать extern "C" для публичных статических вещей.

...