解决在 WP8/ WP8.1 项目中 引用 C++ 组件时出现的 System.TypeLoadException 错误

 本文为个人博客备份文章,原文地址:

http://validvoid.net/wp-cpp-typeloadexception/

使用 Visual Studio 2013 update 4 在 WP8/ WP8.1 项目引用 C++ 组件如果遭遇到

System.TypeLoadException: Requested Windows Runtime type 'XXXXX.XXXXX' is not registered.  

这一错误,是由于 Visual Studio 2013 update 4 的一个 bug 导致引用 C++ 组件后没有正常为 C++ 在应用的清单文件中进行注册。该问题可以通过两种方法解决。

第一种方法,暴力替换 update 4 版中的如下文件为 update 3 版本:

* Microsoft.AppxPackage.Targets
* Microsoft.Build.AppxPackage.dll

文件路径

C:Program Files (x86)MSBuildMicrosoftVisualStudiov12.0AppxPackage

然而并不推荐这么做,谁也不知道替换之后还会出现什么 bug(s)。

第二种方法,也就是目前的正确姿势是修改应用的清单文件:

在应用的清单文件 (Package.appxmanifest) 中末尾的 </Package>节点前加入如下配置代码:

<Extensions>  
  <Extension Category="windows.activatableClass.inProcessServer">
    <InProcessServer>
      <Path>AAA.dll</Path>
      <ActivatableClass ActivatableClassId="AAA.BBB" ThreadingModel="both" />
    </InProcessServer>
  </Extension>
</Extensions>  

其中,AAA.dll为 C++ 组件的 .dll 文件名;AAA.BBB 为报错信息中提示的未注册的类型名称。

原本以上这段配置应该是 VS 自动添加的,而它并没有这么做,所以导致里上述问题的发生,手动添加后即可解决问题。

提示

  1. 一般情况下,引用 C++ 组件出现问题,请先确保正确引用了 .winmd 文件而不是 .dll 文件;同时要确保 .winmd 和 .dll 文件名一致。

  2. 在 Visual Studio 2013 update 5 中,上述 bug 已经得到修正。

本博客系备份博客,原博客地址为: http://validvoid.net/
原文地址:https://www.cnblogs.com/validvoid/p/wp-cpp-typeloadexception.html