исключение HRESULT: 0x800700C1 при выполнении приложения С#, ссылающегося на собственную библиотеку С++ с повышением

Я запускаю приложение С#, которое ссылается на проект-оболочку C++\CLI, который, в свою очередь, ссылается на собственный проект С++, зависящий от библиотеки Boost 1.47 (ссылки на файлы формы ...vc100-mt-gd-1_47.lib)

Все библиотеки статически связаны, и все отлично компилируется. Выполнение приложения C# приводит к исключению: «... не является допустимым приложением Win32. (Исключение из HRESULT: 0x800700C1)». утверждая, что какая-то зависимость где-то отсутствует.

Приложение C# настроено на платформу x86, в то время как все остальные проекты — Win32, включая двоичные файлы boost.

РЕДАКТИРОВАТЬ: перед добавлением использования библиотеки Boost она ДЕЙСТВИТЕЛЬНО работала

Как я могу отследить проблему?


person Leo    schedule 11.11.2011    source источник
comment
Это не ошибка типа отсутствующей зависимости. Должна быть целевой настройкой платформы.   -  person Hans Passant    schedule 11.11.2011
comment
хотя это указано в описании ошибки?   -  person Leo    schedule 11.11.2011
comment
Возможно, AnyCPU является правильной настройкой, трудно догадаться из вашего описания. Используйте инструмент SysInternals ProcMon.exe, чтобы проверить свои предположения. Вы увидите, что он загружает любые библиотеки DLL, которые, возможно, не являются зависимыми от собственного кода. 64-разрядная собственная библиотека DLL вызовет это исключение, если целевой платформой является x86.   -  person Hans Passant    schedule 11.11.2011
comment
Какие детали я могу предоставить, чтобы помочь? Также обратите внимание на редактирование о повышении, являющемся причиной   -  person Leo    schedule 11.11.2011
comment
Какие библиотеки Boost вы используете?   -  person ildjarn    schedule 11.11.2011
comment
Boost.Log и его зависимости. потоки, дата-время, файловая система..   -  person Leo    schedule 12.11.2011
comment
Официальной библиотеки Boost.Log нет, только предложенные. Вы пользуетесь предложенной библиотекой Джона Торжо, Андрея Семашева или другой?   -  person ildjarn    schedule 12.11.2011
comment
Тот, что первым появляется в гугле: Андрей Семашев.   -  person Leo    schedule 12.11.2011
comment
Я подозреваю, что ваша проблема может быть связана с привязкой созданного по умолчанию Boost.Thread к приложению с использованием /clr. Взгляните на эту тему и ее ответ.   -  person ildjarn    schedule 15.11.2011
comment
@leo ты решил эту проблему?   -  person Seth    schedule 13.02.2012
comment
@ Сет, да, есть. Я не уверен, почему это происходит, но когда проект CLR ссылается на собственный проект, использующий boost, библиотеки boost должны быть динамически связаны. статическая связь по какой-то причине не работает.   -  person Leo    schedule 07.03.2012
comment
Все проекты C++-CLI должны быть статически связаны с CRT! И поскольку ваша библиотека Boost использует CRT, они должны использовать CRT, а это значит, что вы должны использовать DLL-версию CRT во всех проектах!   -  person Jochen Kalmbach    schedule 21.07.2013
comment
Как было предложено ранее, могут быть некоторые отсутствующие зависимости. загрузите обходчик зависимостей и изучите исполняемый файл. Отсутствующие библиотеки DLL должны быть отмечены красным цветом.   -  person AcidJunkie    schedule 10.03.2014


Ответы (2)


Это известная проблема. Причина в локальном хранилище потоков (TLS), используемом в Boost::Thread. Чтобы исправить это, вы должны отключить libboost_thread-vcXXX-mt-1_XX.lib и заставить компоновщик связать вашу сборку C++/CLI с boost_thread-vcXXX-mt-1_XX.lib (заглушка boost_thread-vcXXX-mt-1_XX.dll) .

Или вы можете создать свою собственную DLL и связать ее с libboost_thread-vcXXX-mt-1_XX.lib. Затем вы можете связать свою C++ DLL со сборкой C++/CLI.

Видеть

person Dmytro Ovdiienko    schedule 04.05.2014

Наткнулся на эту неприятную ошибку на днях, пытаясь запустить приложение IIS на моем 64-битном ПК Visat:

Ошибка: не является допустимым приложением Win32. (Исключение из HRESULT: 0x800700C1)

Решение:

В IIS 7 нажмите «Пулы приложений» (слева под {machine_name}). Выберите свой пул приложений, а затем нажмите «Дополнительные параметры» справа. Второй параметр в списке: «Включить 32-разрядные приложения» — должно быть установлено значение «Истина».

person Raj Kumar    schedule 03.07.2014