C# 错误MSB3171:生成清单时出现问题

C# 错误MSB3171:生成清单时出现问题,c#,visual-studio-2008,visual-studio-2010,c++-cli,manifest,C#,Visual Studio 2008,Visual Studio 2010,C++ Cli,Manifest,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 ta

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++静态LIb/P>
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)

更多详细信息
-为CppCli生成嵌入式清单,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\u NonRest\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清单就在这里

问题
所以我似乎遇到了两个问题:第一,显式生成。为此,我找到了这个链接,尽管我不知道它有多有用:。它说您必须在每个编译单元中使用define。其次,也是现在对我来说最重要的一点,为什么手动更改CppCli.manifest我仍然无法构建CSharp项目

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

编辑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.
  • YetAnother是一个使用卷曲和Boost线程和日期时间的C++项目。
  • curl使用openssl
我在看书(http://marc.info/?l=boost-用户&m=123425857320026),静态链接的boost库根本无法与CLR项目配合。因此,我删除了那些
libboost
行,并在CppCli中使用
BOOST\u ALL\u DYN\u LINK
,将
BOOST\u thread-vc90-mt-gd-1\u 44.lib
BOOST\u date\u time-vc90-mt-gd-1\u 44.lib
复制到YetAnother\Debug目录。同样的错误。解决方案会生成,但当我尝试执行CppCli代码时,它表示我没有运行有效的Win32应用程序

编辑2011/06/16
放弃!很明显,我因为冒用微软的名字而受到惩罚。网上有太多评论说boost static LIB和CLR不兼容。我将CppCli更改为不使用CLR,并通过P/Invoke而不是Interop与CSharp通信

编辑2011/06/17

P/Invoke没有问题。

我以前遇到过这个问题,这是因为不知何故,一堆NGENed程序集被损坏,不再被识别为有效的64位或32位程序集。我首先开始逐个删除NGENed程序集,当尝试加载另一个依赖项时,编译将失败;它一直延伸到mscorlib,在这一点上,我删除了所有NGENed程序集。在那之后,一切都很好,一旦他们被重新安排好

这似乎是个简单的问题。您正在混合任何CPU和x86或x64二进制文件。将它们全部设置为特定的平台,它应该会消失。@Ritch Melton-没什么,将平台目标更改为x86 for CSharp project没有帮助。请尝试提高生成输出的详细程度,这可能会为您提供更多信息。转到工具->选项->项目和解决方案->构建和运行。在这里,您将看到两个组合:MSBuild项目生成输出详细信息和MSBuild项目生成日志文件详细信息。如您所愿更改它们,我更喜欢提高构建日志文件的详细程度,因为HTML更易于查看at@dario_ramos:那也没用。当我运行应用程序时,只会收到一条错误消息,说明我将要执行的代码不是有效的Win32应用程序。问题可能出在您的外部非托管库中(即,它可能已编译为64位)。尝试建立一个非托管C++项目,一个exe,它调用非托管库中的一些函数。看看你是否可以运行它。@rturrado:这是本机映像生成器。它将程序集编译为本机代码并缓存结果。本机映像存储在c:\windows\assembly\NativeImage\u v**下。我是说,我认为缓存的本机映像已损坏。找到损坏的本机映像并将其删除,或者完全删除nativeImages目录(因为可能有多个本机映像损坏,就像我的一样)。它们将由在特定时间运行的NGEN服务重建(这是一个Windows服务)。Hein-接受这个答案,因为这是唯一的答案!谢谢:)
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