загрузить c ++ dll в ironpython

У меня есть приложение ironpython, которое использует библиотеки DLL. Некоторые библиотеки DLL написаны на C #, а одна - на управляемом C ++. Приложение отлично работает на моем хосте и на любом хосте, который включает установку Visual Studio (2010).

Когда я попытался запустить это приложение на хостах без vs, это не удалось. После некоторой проверки я обнаружил, что ironpython не может загрузить dll c ++. После установки vs - приложение работает нормально.

Я сузил его: dll можно загрузить после установки: -Отчетов об ошибках приложений Microsoft -VC 9.0 Runtime (x86) -VC 10.0 Runtime (x86) -Microsoft visual studio macro tools

Я попытался установить распространяемый пакет Microsoft Visual C ++ 2010 http://www.microsoft.com/download/en/details.aspx?id=5555, и это не помогло.

  1. Почему? что именно происходит при установке vs, чего не происходит, когда я устанавливаю компонент распространяемого пакета Microsoft Visual C ++ 2010?
  2. Как я могу отслеживать ошибки, возникающие при загрузке dll с помощью ipy?

Спасибо!


person efrat_oio    schedule 08.04.2012    source источник


Ответы (1)


Библиотека DLL, написанная на управляемом C ++, использует ее в качестве стандартных библиотек. Вы можете изменить его на статические библиотеки. Следуй этим шагам

  1. Откройте свойства проекта в Visual Studio (щелкните проект правой кнопкой мыши)
  2. Щелкните путь к Configuration Properties> C ++> Code Generation.
  3. Справа найдите библиотеку времени выполнения и выберите Multi-Threaded Debug (/MTd)
  4. Сделайте то же самое для сборки Release, но на этот раз выберите Multi-Threaded (/MT)
  5. Восстановить все

Что касается ваших конкретных вопросов:

1. Распространяемая программа установки скопирует DLL в системный путь. Visual Studio сделает то же самое. Поэтому, если это не сработает, убедитесь, что у вас есть 32- или 64-битные двоичные файлы (такие же, как ваш код, а не платформа, на которой вы работаете). + Если вы работаете с консоли, закройте ее и запустите новую, чтобы получить обновленный путь.

2. Используйте Dependency Walker. Загрузка вашей DLL покажет вам, что она ищет, этого должно быть достаточно. Чтобы отслеживать его выполнение во время выполнения, загрузите IronPython. В меню «Профиль» выберите «Начать профилирование» и укажите командную строку, которая воспроизведет вашу проблему.

person ixe013    schedule 08.04.2012
comment
Хорошо, хороший ответ, мой проект был многопоточным DLL (MD), а не MT, как вы сказали, но, к сожалению, поскольку я использую тег / clr: oldsyntax (и мне нужно использовать его для компиляции этого фрагмента кода, поскольку он упаковывает код C) Я не могу скомпилировать проект в режиме MT ... - person efrat_oio; 08.04.2012
comment
И что будет на выходе DependencyWalker, когда вы загрузите в него свою DLL? Вы можете сравнить результат на машине, где она работает, и на машине, где она не работает. - person ixe013; 08.04.2012
comment
Да, я сравнил его и обнаружил, что проблема в том, что я использовал сборку DEBUG вместо сборки выпуска. Поэтому после установки vs все заработало. - person efrat_oio; 10.04.2012
comment
Вы не единственный, кого укусили варианты сборки VS по умолчанию. Рад слышать, что теперь он работает! - person ixe013; 10.04.2012