解决方案工程升级到 VC++ 2019/2022(Visual Studio)以后编译调用CLR虚拟机的程序代码失败,原因是新语法冲突。

解决办法有两个

1、降到 VC++ 2015/2017 及以下编译器构建程序

2、修改 mscorlib.tlh.h 头文件上面的语法冲突错误

为什么会导致语法错误,原因为:Micrsoft C/C++ 语言词法扩展.....

not、and、or,这VB/LUA运算符的既视感,就是这两个版本 VC++ 扩展的全新语法糖套路,但也正因为扩展的两个语法糖,导致了 mscorlib.tlh.h 头文件上面一些参数名为 “or” 的编译不过,因为VC++高版本编译器把它认为是关键字处理。

重点是这玩意还不能通过降低VC++编译器标准、VC++标准库来解决问题,是的,这又是一个最搞事的 Microsoft MSBuild 扩展,MMP。

有些童靴可能不懂,什么叫做 Microsoft MSBuild 扩展,意思是不通过 Microsoft MSBuild 进行编译代码,可能无法通过,各种语法错误让你知道花有多么红?!

Microsoft MSBuild 相当于是一个编译中间件,一个VS解决方案工程进行编译的时候,首先需要提交到 MSBuild 进行一次编译之后才能提交到具体编译器处理,简单理解你的解决方案代码要编多次才能输出,我们想要的具体目标程序二进制文件。

VC++ 自动从 MSCoreEE.tlb(.NET CLR虚拟机)类型库之中生成调用的头文件,文件到本工程的源目录下。

#include "mscorlib.tlh"

#pragma comment(lib, "MSCorEE.lib")

// Import mscorlib.tlb (Microsoft Common Language Runtime Class Library).
#import "mscorlib.tlb" raw_interfaces_only				\
    high_property_prefixes("_get","_put","_putref")		\
    rename("ReportEvent", "InteropServices_ReportEvent")

修改:mscorlib.tlh.h,ITrackingHandler interface

struct __declspec(uuid("03ec7d10-17a5-3585-9a2e-0596fcac3870"))
ITrackingHandler : IDispatch
{
    //
    // Raw methods provided by interface
    //

      virtual HRESULT __stdcall MarshaledObject (
        /*[in]*/ VARIANT obj,
        /*[in]*/ struct _ObjRef * _or ) = 0;
      virtual HRESULT __stdcall UnmarshaledObject (
        /*[in]*/ VARIANT obj,
        /*[in]*/ struct _ObjRef * _or) = 0;
      virtual HRESULT __stdcall DisconnectedObject (
        /*[in]*/ VARIANT obj ) = 0;
};
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐