迁移到VS2013.4后调用WinRT组件时类未注册的异常

mjr*_*r27 11 javascript c# windows-runtime windows-store-apps visual-studio-2013

我有一个HTML5应用程序,它包含一个用于文件系统操作的.winmd组件(sqlite,zip存档等).

升级到2013.4后,该组件突然停止工作.Javascript仍然可以看到所有类和函数,但是当我尝试调用它们中的任何一个时,我得到"WinRT:Class not registered"异常.

完全VS重新安装没有帮助.也没有升级到社区版本.在桌面(8.1pro)和笔记本电脑(win8.1单语言)上重现此行为

我花了2天尝试找出什么是错的,我发现它只要组件包括任何asyncronous活动(如等待/异步或只是Task.Delay(100))失败

所以我担心的是......发生了什么事?哪里我错了,我该怎么办?

现在正在安装2015预览版.如果我使用系统还原回滚到2013.3,项目工作正常,但VS处于半破坏状态,并且MS网站上没有链接可以下载以前的版本.

如果我说的没有任何意义,我可以上传一个文件,其中包含最简单的VS解决方案来重现问题.但简而言之,它很简单:

namespace NSUtil {
  public sealed class Test{
    public static IAsyncOperation<string> DoSomething () {
      return Task<string>.Run(async () => {
        await Task.Delay(100);
        return "";
      }).AsAsyncOperation();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

一旦我NSUtil.Test.doSomething()从javascript 调用,我就会得到WinRTError: Class not registered例外.

所以问题是......我/我的电脑/我的安装/微软开发者有什么问题?

mjr*_*r27 2

答案是:应该在 package.appxmanifest 中放入以下几行:

<Extensions>
  <Extension Category="windows.activatableClass.inProcessServer">
    <InProcessServer>
      <ActivatableClass ActivatableClassId="MyNS.MyClass1" ThreadingModel="both" />
      <ActivatableClass ActivatableClassId="MyNS.MyClass2" ThreadingModel="both" />
      ...
      <ActivatableClass ActivatableClassId="MyNS.MyClassN" ThreadingModel="both" />
    </InProcessServer>
  </Extension>
</Extensions>
Run Code Online (Sandbox Code Playgroud)

MyNS.MyClass{N}暴露给 WinRT 的所有类在哪里。由于某些奇怪的原因,VS2013.4 不自己做,所以我不得不自己做