C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(2341,9): error MSB3171: Problem generating manifest. Could not load file or assembly '...CppCli.dll.manifest' or one of its dependencies. An attempt was made to load a program with an incorrect format.
我在编译CSharp项目时遇到此错误,其中:

CSharp项目

一个VS2008 C#项目,将CppCli项目添加为引用

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

CppCli项目

链接到外部C++静态库的VS2008 C++/CLI项目
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生成嵌入式 list ,CSharp正确构建。
-Microsoft.Common.targets的2341行是有关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,在查询C:\MyProject\Microsoft.VC90.DebugCRT.dll.manifest时,procmon跟踪显示未找到名称。显然,CRT list 不存在。关键是我找不到CRT list 所在的C:\Archivos de programa ...\Microsoft.VC90.DebugCRT.dll.manifest的任何跟踪信息。

问题
因此,我似乎在这里遇到了两个问题:第一, list 生成。为此,我找到了此链接,尽管我不知道它会有多有用:http://www.eggheadcafe.com/software/aspnet/33380343/compiling-32bit-application-x86-in-vs2008-vc2008-on-vista-64bit----x64.aspx。它说您必须在每个编译单元中使用一个定义。其次,对我来说最重要的是,如何手动更改CppCli.manifest仍然无法构建CSharp项目。

编辑
我已经使用工具向导将项目移至VS2010,但仍然存在相同的问题。

编辑2011/06/13
我现在要使用“使用嵌入式 list ”选项。该项目已生成,但是当我尝试执行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。
  • YetAnother是一个C++项目,它使用curl和boost线程以及日期时间。
  • curl使用openssl。

  • 我正在阅读(http://marc.info/?l=boost-users&m=123425857320026),静态链接的boost库根本无法与CLR项目兼容。因此,我删除了这些libboost行,并在CppCli中使用BOOST_ALL_DYN_LINK,将boost_thread-vc90-mt-gd-1_44.libboost_date_time-vc90-mt-gd-1_44.lib复制到YetAnother\Debug目录中。同样的错误。该解决方案已经构建,但是当我尝试执行CppCli代码时,它表明我没有运行有效的Win32应用程序。

    编辑2011/06/16
    放弃!我显然因徒劳地使用Microsoft名称而受到惩罚。网上有太多评论说boost静态库和CLR不兼容。我将CppCli更改为不使用CLR,并通过P/Invoke而不是Interop与CSharp通信。

    编辑2011/06/17
    使用P/Invoke一切都很好。

    最佳答案

    我以前遇到过此问题,这是因为不知何故,一堆NGENed程序集已损坏,不再被视为有效的64位或32位程序集。我首先开始一个接一个地删除NGENed程序集,并且在尝试加载另一个依赖项时编译将失败。一直到mscorlib,这时我删除了所有NGENed程序集。之后,当它们重新生成后,一切都很好。

    关于c# - 错误MSB3171 : Problem generating manifest,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6267787/

    10-13 07:54