Класс незарегистрированного исключения при вызове компонента WinRT после перехода на VS2013.4

У меня есть приложение HTML5, которое содержит компонент .winmd, используемый для операций файловой системы (sqlite, zip-архивы и т.д.).

После обновления до 2013 года этот компонент внезапно перестает работать. Javascript по-прежнему видит все классы и функции, но когда я пытаюсь вызвать любой из них, я получаю исключение "WinRT: Class not registered".

Полная переустановка VS не помогла. Также не обновилась версия сообщества. Это поведение воспроизводится как на рабочем столе (8.1pro), так и на ноутбуке (один одиночный язык win8.1)

Я потратил 2 дня, пытаясь понять, что неправильно, и я обнаружил, что он терпит неудачу, как только компонент включает в себя любую асинхронную активность (например, await/async или просто Task.Delay(100))

Итак, моя забота... Что происходит? Где я был неправ и что я могу сделать?

В настоящий момент установка предварительного просмотра 2015 года. Если я вернусь к 2013.3.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();
    }
  }
}

и как только я вызываю NSUtil.Test.doSomething() из javascript, я получаю исключение WinRTError: Class not registered.

Итак, вопрос в том, что.... Что случилось со мной/моими установщиками pc/my vs/microsoft?

Ответ 1

И ответ: нужно положить в package.appx манифест следующие строки:

<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 не делает этого сам по себе, поэтому мне пришлось сделать это самостоятельно

Ответ 2

проверьте разрешение на использование приложения и запустите его как admin vs, чтобы использовать классы javaScript или изменить местоположение файла проекта на другой диск. в Windows 8.1 иногда для приложения требуется разрешение администратора на использование файлов и классов.