You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++编译报错MDM2009:引用多Windows组件库时元数据出现重复类型

C++ MDM2009编译错误(重复元数据类型)解决方法

问题说明

开发时遇到C编译错误MDM2009,错误提示为处理元数据文件时发现重复类型,该问题出现在两个存在共同依赖库的Windows组件库引用场景中。
解决方案结构如下:
解决方案结构
错误触发原因:编译器检测到WCL1.winmd中所有公共接口、类均存在重复,根因为该winmd文件同时存在于WCL4的bin目录下,Microsoft.Windows.CppWinRT NuGet包会自动从应用引用的组件项目生成的.winmd文件生成C
头文件,重复的元数据文件触发了类型检测错误。

此前已尝试的无效方案:

  • 将指定的ItemGroupDescription元素添加到所有.csproj文件和应用的PropertySheet.props文件
  • 迁移WCL2的代码至WCL3后移除WCL2,调整为应用直接引用WCL1、WCL3、WCL4

解决步骤

方法一:配置CppWinRT排除重复元数据(推荐,无需修改依赖项目)

在C++应用项目的.vcxproj文件,或者项目使用的公共属性表(.props)文件中添加如下配置,明确告知CppWinRT工具链跳过重复的WCL1元数据文件:

<ItemGroup>
  <!-- 排除WCL4输出目录中的重复WCL1.winmd,可根据实际路径调整,也可使用通配符**\WCL1.winmd匹配所有路径 -->
  <CppWinRTMetadataInputRemove Include="$(WCL4输出目录的绝对或相对路径)\WCL1.winmd" />
</ItemGroup>

方法二:从根源避免重复元数据生成

如果你可修改WCL4项目的配置,可以在WCL4的.csproj文件中添加如下配置,避免WCL4将依赖的WCL1.winmd复制到自身输出目录:

<PropertyGroup>
  <!-- 禁止复制依赖项的本地文件到输出目录 -->
  <CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies>
</PropertyGroup>
<ItemGroup>
  <!-- 调整WCL1的引用配置,不将WCL1的输出文件复制到WCL4的输出目录 -->
  <ProjectReference Include="..\WCL1\WCL1.csproj">
    <Private>False</Private>
  </ProjectReference>
</ItemGroup>

最终验证

完成配置后,清理解决方案所有中间缓存与输出文件,执行全量重新构建即可解决MDM2009错误。

内容的提问来源于stack exchange,提问作者jasonxz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:15:08