在MFC应用中使用Xaml Islands时出现C2139未定义类错误如何解决?
问题解决方案
错误根因
该C2139编译错误本质是编译器处理C++/WinRT的as<>类型转换时,未找到IDesktopWindowXamlSourceNative原生COM接口的完整类型定义,属于类型未声明导致的派生错误。
修复步骤
- 调整头文件包含顺序
必须在引入任何C++/WinRT相关头文件前,先包含该接口的定义头文件,建议直接添加到MFC项目的预编译头(stdafx.h/pch.h)的头部,示例顺序如下:// 放在所有C++/WinRT头文件之前 #include <windows.ui.xaml.hosting.desktopwindowxamlsource.h> #include <winrt/base.h> // 后续添加其他WinRT投影头、MFC相关头文件 - 校验Windows SDK版本
IDesktopWindowXamlSourceNative仅在10.0.17763.0(Windows 10 1809)及以上版本的Windows SDK中提供,可右键项目进入【属性-常规-目标平台版本】,选择符合要求的SDK版本后保存。 - 补充全局作用域符
该接口是原生Win32 COM接口,不存在于C++/WinRT的winrt命名空间下,调用时需要添加全局作用域符::明确指定命名空间,修改报错行代码为:auto interop = _desktopWindowXamlSource.as<::IDesktopWindowXamlSourceNative>(); - 确认C++/WinRT支持已开启
右键项目进入【属性-常规-C++/WinRT支持】,确认选项设置为「是」,重新生成项目触发C++/WinRT投影头的自动生成逻辑。 - 清理缓存重编
选择【生成-清理解决方案】,手动删除项目目录下的Generated Files文件夹后重新生成,排除旧的中间缓存文件导致的编译异常。
内容的提问来源于stack exchange,提问作者Hasan Williams
相关产品推荐
相关产品推荐

