Класс незарегистрированного исключения при вызове компонента 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 иногда для приложения требуется разрешение администратора на использование файлов и классов.