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

12
我有一个HTML5应用程序,其中包含一个用于文件系统操作的.winmd组件(例如SQLite、zip档案等)。
在升级到2013.4版本后,这个组件突然停止了工作。虽然Javascript仍然看到所有的类和函数,但是当我尝试调用它们中的任何一个时,都会出现“WinRT:未注册的类”异常。
完全重新安装VS没有帮助。升级到社区版也没有。这种行为在桌面(8.1pro)和笔记本电脑(win8.1单语言)上都可以重现。
我花了2天时间来找出问题所在,发现只要组件包含任何异步活动(如await/async或只是Task.Delay(100)),它就会失败。
我的担心是...出了什么问题?我做错了什么,我能做些什么?
现在正在安装2015预览版。如果我使用系统还原回滚到2013.3版本,项目就正常工作,但VS会变得半破损状态,并且微软网站上没有链接可以下载先前的版本。
如果我说的不清楚,我可以上传一个最简单的VS解决方案文件来重现问题。总之,它很简单:
namespace NSUtil {
  public sealed class Test{
    public static IAsyncOperation<string> DoSomething () {
      return Task<string>.Run(async () => {
        await Task.Delay(100);
        return "";
      }).AsAsyncOperation();
    }
  }
}

当我从javascript调用NSUtil.Test.doSomething()时,我立即收到WinRTError: Class not registered异常。

那么问题来了......是我/我的电脑/我的VS安装/Microsoft开发人员哪里出了问题?


我在两台机器上遇到了完全相同的问题,一台是通过IDE的开发机器,另一台是通过命令行的构建机器。目前还没有解决方案。 - kassim
目前还没有解决方案。回滚到vs2013.3版本。唉 - mjr27
异步函数在JS中不应该返回任何内容,至少不能在DoSomething的第一行返回。你为什么要返回呢?我偶然发现了这些资源,或许能帮到你: http://stackoverflow.com/questions/12890841/cant-use-create-async-with-wrl-winrt-component?rq=1 http://blogs.msdn.com/b/shawnhar/archive/2014/11/10/wrl-implementations-of-ivector-and-iasyncoperation.aspx - Keenan Lidral-Porter
在你的C#类中使用try catch并获取异常。 - xwpedram
2个回答

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>

其中MyNS.MyClass{N}都是暴露给WinRT的类。 由于某些奇怪的原因,VS2013.4不能自动完成此操作,因此我必须自己手动完成。


0

请检查您的应用程序权限并以管理员身份运行,或者使用JavaScript类或将项目文件位置更改为其他驱动器。在Windows 8.1中,有时应用程序需要管理员权限才能使用文件和类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接