最初的问题是我尝试使用调试符号重建C ++项目并将其复制到测试机器。项目的输出是外部COM服务器(.exe文件)。
调用COM接口函数时,有一个RPC调用failre: COMException(0x800706BE):远程过程调用失败。
根据COM HRESULT设计,如果FACILITY代码是7,它实际上是WIN32错误,win32错误代码是0x6BE,这是上面提到的“远程过程调用失败”。
我所做的就是替换COM服务器.exe文件,原始文件运行良好。
当我签入项目时,我发现它是一个带有托管扩展的C ++项目。 当我用反射器检查DLL时,它显示了另外两个.NET程序集引用。
然后我检查了项目设置,没有发现额外的2个程序集引用。 我打开show包括编译器选项和链接器的详细库,并尝试 分析是否通过.h文件间接引用程序集。
我收集了所有.h文件并使用'#using''#import'和汇编文件本身grep所有文件。
其中一个.h文件确实存在'#using',但与引用的程序集无关。
关于链接的.lib库文件,只有一个.lib文件是另一个支持托管扩展的C ++项目的副产品,所有其他文件都是由纯粹的传统C ++项目生成的。对于启用了托管扩展的C ++项目,我检查了输出DLL程序集,它没有引用2程序集。
我甚至尝试通过sysinternal的filemon和procmon捕获附加程序集文件的访问权限,但重建过程不会访问这些文件。
我对VC ++ / CLI项目的编译和链接过程模型非常困惑,其中附加的程序集参考进入了最终的程序集?
提前感谢您的任何帮助。
答案 0 :(得分:1)
我已经解决了这个问题,我想分享一些经验:
VC ++编译器可以将整个项目视为启用ManagedExtension,您可以通过它进行设置 项目属性 - >一般 - >公共语言运行时支持。
您也可以为单个.cpp文件打开它,但在.vcproj文件中,整个项目的属性名称是“ManagedExtension”,而单个.cpp文件的属性是“CompileAsManaged”
VC ++编译在编译时嵌入引用的程序集,而不是链接时间。因此,在.obj文件中嵌入了对特定版本的程序集的引用。我使用cygwin的字符串 用于提取引用程序集名称的实用程序
.lib文件只是.obj文件的存档
从链接器的角度来看,本机.obj文件和.lib文件之间没有区别。 MSIL代码的元数据只是作为数据存储在一个部分中(我猜)。
顺便说一下,我曾尝试使用reflector + reflexi来破解参考装配版本,但是这个功能无法用于混合装配。