解决 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++ 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;
};
更多推荐
所有评论(0)