Неуправляемые библиотеки C ++ - различия между VS2005 и VS2008? - PullRequest
1 голос
/ 04 ноября 2008

Я предвосхищу это, говоря, что я программист на C #, унаследовавший ужасный код без документации. У меня есть неуправляемая библиотека C ++, обернутая управляемым кодом, которая прекрасно работала в VS2003 с .Net 1.1 Framework. Я пытаюсь обновить его как минимум до .Net 2.0.

У меня есть неуправляемая библиотека C ++, которая была скомпилирована с «MSVC 8.x» (таким образом, я предполагаю, что она эквивалентна VS 2005). Я пытался все перенести на VS2008, но у меня все еще есть проблемы с этой библиотекой во время выполнения.

У меня такой вопрос: должна ли эта библиотека работать с VS2008? Или я должен разрабатывать в VS2005, если библиотека была скомпилирована с VC8.x?

Любые мысли будут с благодарностью. Спасибо!

Ответы [ 3 ]

2 голосов
/ 04 ноября 2008

Это должно сработать, я ожидаю, что у вас есть проблемы с вашей сортировкой. Вероятно, это материал, который был объявлен неправильно для PInvoking, который работал в .NET 1.1, но не в более поздних версиях.

Вы не говорите, какие у вас проблемы во время выполнения, и не говорите, как вы получаете доступ к своей библиотеке. Например, вы компилируете свою библиотеку вместе с вашим проектом? Если да, можете ли вы включить неуправляемую отладку в своем проекте на C # и войти в код, с которым у вас возникли проблемы? Как вы называете неуправляемый код? Это через PInvoke или вы управляли оболочками C ++?

По моему опыту, наилучшим решением для вызова устаревшей неуправляемой библиотеки является добавление управляемой библиотеки-оболочки для устаревшей библиотеки, написанной на управляемом C ++. Таким образом, вы предоставляете управляемый интерфейс для своей библиотеки для использования всеми языками .NET, и вам не нужно беспокоиться о том, чтобы ваши подписи PInvoke были правильными.

Ваш проект должен выглядеть примерно так.

Приложение C # -> Управление C ++ Wrapper DLL -> Старая DLL

1 голос
/ 04 ноября 2008

Это может зависеть от того, на что еще опирается библиотека. Например, если вы используете STL через интерфейсы библиотеки, было бы плохой идеей скомпилировать библиотеку с другой версией для клиента. Однако, если библиотека представляет простой интерфейс функций в стиле C, у вас не должно возникнуть проблем.

Если у вас есть исходный код для библиотеки, я бы порекомендовал попытаться перенести его на VS2008. В общем, в долгосрочной перспективе гораздо труднее иметь все в одной среде разработки.

Как вы переносите неуправляемую библиотеку ... предположительно, используя управляемые расширения для C ++, если она восходит к VS2003. Теперь это устарело и было заменено на C ++ / CLI с VS2005. Хотя новые компиляторы поддерживают параметр / clr: oldSyntax для того, чтобы все еще компилировать старый код, с ним, безусловно, есть проблемы. У нас есть старый код, который не будет компилироваться на VS2005 (8) с использованием этого ключа.

0 голосов
/ 04 ноября 2008

- Роб Проуз:
Оболочка использует управляемый C ++, без PInvoke. Оболочка компилируется в DLL, которая затем используется другим приложением (как вы показали).

Устаревший код создает графические объекты. Когда я пытаюсь получить указатель на изображение, я получаю пустое исключение вместо этого. Отладчик не позволяет мне углубляться в код, чтобы выяснить, почему. Все остальное работает нормально - другие объекты данных, необходимые для создания изображения, существуют и кажутся правильными. (Извините, я знаю, что это все еще довольно расплывчатое описание.)

- Роб Уокер:
У меня, к сожалению, нет исходного кода. Не уверен насчет "использования STL через интерфейсы библиотеки". Графика подпадает под эту категорию?

Мне удалось запустить приложение с помощью переключателя / clr: oldSyntax, но там я получаю нулевые маркеры для изображений. Я пытался вставить все модификации, чтобы он компилировался с / clr, но потом продолжал получать ошибки ссылок, которые я не мог устранить. (Компоновщик продолжал жаловаться на невозможность найти файлы, даже если эти файлы были в папке, где он искал.)

...