rtu*_*ado 9 c# c++-cli manifest visual-studio-2010 visual-studio-2008
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
安装的软件(据我所知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
Run Code Online (Sandbox Code Playgroud)
更多细节
- 为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_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.它说你必须在每个编译单元中使用一个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
Run Code Online (Sandbox Code Playgroud)
依赖关系是:
我正在阅读(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
放弃!我显然因为微软的名字徒劳而受到惩罚.网上有太多评论说增强静态库和CLR是不兼容的.我将CppCli更改为不使用CLR,并通过P/Invoke而不是Interop与CSharp通信.
编辑2011/06/17
所有罚款与P/Invoke.
我以前遇到过这个问题,这是因为不知何故一堆 NGENed 程序集被损坏,并且不再被识别为有效的 64 位或 32 位程序集。我首先开始逐个删除 NGENed 程序集,当尝试加载另一个依赖项时编译会失败;它一直到 mscorlib,此时我删除了所有 NGENed 程序集。在那之后,一旦他们被重新 NGENed,一切都很好。