WinUI3+C++/WinRT创建runtimeclass遇LNK2001链接错误求助
解决WinUI3 C++/WinRT ListView DataType编译链接错误
问题分析
你遇到的LNK2001错误是因为生成的ContactT基类错误地引入了IComponentConnector接口的方法(Connect和GetBindingConnector)。这类接口是XAML页面、用户控件等需要加载XAML内容的类型才会实现的,而你创建的Contact是作为数据绑定的普通runtimeclass,完全不需要这些接口。
解决方案
1. 确认idl文件的编译类型
右键项目中的Contact.idl文件 → 属性 → 配置属性 → 常规 → Item Type,确保设置为MidlRT Compiler。如果误设为XAML Compiler,会生成XAML控件相关的代码,导致不必要的接口依赖。
2. 清理并重新生成项目
- 点击Visual Studio菜单的生成 → 清理解决方案
- 删除项目目录下的
Generated Files文件夹(通常位于项目根目录或x64/Debug等输出目录内) - 重新生成解决方案
3. 完善数据类的属性实现(针对数据绑定需求)
如果需要在DataTemplate中绑定属性,需在idl中添加属性定义,示例如下:
Contact.idl
namespace Pine { [default_interface] runtimeclass Contact { Contact(); string Name { get; set; } string Phone { get; set; } } }
Contact.h
#pragma once #include "Contact.g.h" namespace winrt::Pine::implementation { struct Contact : ContactT<Contact> { Contact(); winrt::hstring Name(); void Name(winrt::hstring const& value); winrt::hstring Phone(); void Phone(winrt::hstring const& value); private: winrt::hstring m_name; winrt::hstring m_phone; }; } namespace winrt::Pine::factory_implementation { struct Contact : ContactT<Contact, implementation::Contact> { }; }
Contact.cpp
#include "pch.h" #include "Contact.h" #if __has_include("Contact.g.cpp") #include "Contact.g.cpp" #endif using namespace winrt; using namespace Microsoft::UI::Xaml; namespace winrt::Pine::implementation { Contact::Contact() {} winrt::hstring Contact::Name() { return m_name; } void Contact::Name(winrt::hstring const& value) { m_name = value; } winrt::hstring Contact::Phone() { return m_phone; } void Contact::Phone(winrt::hstring const& value) { m_phone = value; } }
完成以上步骤后,编译链接错误应该会消失,你可以正常在XAML的DataTemplate中使用local:Contact作为x:DataType。
内容的提问来源于stack exchange,提问作者Jacques
相关产品推荐
相关产品推荐

