2012-04-08 5 views
0

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

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

я сузил: Библиотеки DLL может быть загружены после установки: -Microsoft ошибки приложения отчетности -vc 9.0 Runtime (x86) -vc 10,0 Runtime (x86) -Microsoft Visual Studio макро инструментов

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

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

Спасибо!

ответ

1

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

  1. Откройте свойства проекта в Visual Studio (щелкните правой кнопкой мыши по проекту)
  2. Нажмите вам способ настройки Свойства> C++> Генерация кода
  3. Справа найти Runtime Library и выберите Multi-Threaded Debug (/MTd)
  4. Сделайте то же самое для сборки выпуска, но на этот раз выберите Multi-Threaded (/MT)
  5. Перестроить все

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

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

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

+0

ОК, хороший ответ, мой проект был многопоточным DLL (MD), а не MT, как вы сказали, но, к сожалению, поскольку я использую тег «/ clr: oldsyntax» (и нужно использовать его для компиляции этой части кода, так как это оболочка кода C) Я не могу скомпилировать проект в режиме MT ... –

+0

И каков вывод DependencyWalker при загрузке вашей DLL в него? Вы можете сравнить вывод на машине, где он работает, и на машине, где он не – ixe013

+0

Да, я сравнил его и обнаружил, что проблема заключалась в том, что я использовал сборку DEBUG вместо сборки release.Вот почему после установки vs это сработало. –

Смежные вопросы