解决 VC++ 2019/2022 无法编译,调用.NET CLR程序的问题

解决方案工程升级到 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;
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值