ошибка MSB3171: проблема создания манифеста

C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ Microsoft.Common.targets (2341,9): ошибка MSB3171: Ошибка создания манифеста. Не удалось загрузить файл или сборку "... CppCli.dll.manifest" или одну из его зависимостей. Была сделана попытка загрузить программу с неправильным форматом.

Я получаю эту ошибку при компиляции проекта CSharp, где:

Проект CSharp

Проект VS2008 C #, который добавляет проект CppCli в качестве ссылки

Output type, Windows application
Platform target, Any CPU
I've also tried with Platform target, x86

] Проект CppCli

Проект VS2008 C ++ / CLI, который связан с внешней статической библиотекой C ++

Targeted framework .NET Framework 3.5
Configuration type, Dynamic Library (.dll)
Configuration properties, Common Language Runtime support, /clr
Manifest tool, Embed manifest, No

Установленное программное обеспечение (я понимаю VS2008 + SP1 и .NET3.5 + SP1)

Microsoft Visual C++ 2005 Redistributable KB2467175
Microsoft Visual C++ 2008 Redistributable KB2467174 x86 9.0.30729.5570
Microsoft Visual C++ 2008 Redistributable x86 9.0.21022
Microsoft Visual C++ 2008 Redistributable x86 9.0.30729.4974

Некоторые дополнительные сведения
- Создает встроенный манифест для CppCli, CSharp строит правильно.
- Строка 2341 Microsoft.Common.targets - это тег, относящийся к GeneralApplicationManifest
- CppCli.intermediate.manifest указывает на Microsoft.VC90.DebugCRT.dll 9.0.30729.4148
- CppCli.manifest указывает на 9.0.21022.8
- C: \ Archivos de programa \ Microsoft Visual Studio 9.0 \ VC \ redist \ Debug_NonRedist \ x86 \ Microsoft.VC90.DebugCRT \ Microsoft.VC90.DebugCRT.manifest показывает версию 9.0.30729.4148
- Если вручную изменить CppCli.manifest на 9.0.30729.4148, трассировки procmon показывают НЕ НАЙДЕННОЕ ИМЯ при запросе C: \ MyProject \ Microsoft.VC90.DebugCRT.dll.manifest. Очевидно, манифеста CRT там нет. Дело в том, что я не нахожу никаких следов, запрашивающих C: \ Archivos de programa ... \ Microsoft.VC90.DebugCRT.dll.manifest, где находится манифест CRT.

Вопросы
Так что я, кажется, здесь встретились две проблемы: во-первых, создание манифеста. Для этого я нашел эту ссылку, хотя не знаю, насколько она будет полезной: http://www.eggheadcafe.com/software/aspnet/33380343/compiling-32bit-application-x86-in -vs2008-vc2008-on-vista-64bit ---- x64.aspx . В нем говорится, что вы должны использовать определение в каждой единице компиляции. Во-вторых, и это для меня сейчас наиболее важно, почему так получилось изменить CppCli.manifest вручную. Я все еще не могу создать проект CSharp.

Edit
Я переместил проект в VS2010, используя мастер инструментов, и у меня все еще есть та же проблема.

Edit 2011/06/13
Сейчас я выберу вариант «использовать встроенный манифест». Проект строится, но когда я пытаюсь выполнить код CppCli, он говорит, что у меня нет допустимого приложения Win32.

Редактировать 2011/06/15
Проект CppCli связан со следующими статическими библиотеками:

YetAnother.lib
libcurl.lib
libboost_system-vc90-mt-gd-1_44.lib
libboost_thread-vc90-mt-gd-1_44.lib
libboost_filesystem-vc90-mt-gd-1_44.lib
libeay32MDd.lib
ssleay32MDd.lib
shlwapi.lib
ws2_32.lib
winmm.lib
wldap32.lib
winhttp.lib

Зависимости:

  • CppCli использует YetAnother.
  • AnotherAnother - это проект C ++, в котором используются потоки curl и boost, а также дата и время.
  • curl использует openssl.

Я читаю (http: // marc .info /? l = boost-users & m = 123425857320026), что статически связанные библиотеки boost вообще не работают с проектами CLR. Поэтому я удаляю эти строки libboost и использую BOOST_ALL_DYN_LINK в CppCli, копирую boost_thread-vc90-mt-gd-1_44.lib и boost_date_time-vc90 -mt-gd-1_44.lib в каталог YetAnother \ Debug. Та же ошибка. Решение строится, но когда я пытаюсь выполнить код CppCli, он говорит, что у меня нет допустимого приложения Win32.

Изменить 2011/06/16
Сдаюсь! Меня явно наказывают за напрасное использование имени Microsoft. В сети слишком много комментариев о том, что статические библиотеки Boost и CLR несовместимы. Я изменю CppCli, чтобы не использовать CLR и общаться с CSharp через P / Invoke вместо Interop.

Редактировать 2011/06/17
Все в порядке с P / Invoke.

9
задан rturrado 17 June 2011 в 02:15
поделиться