Приложение Desktop Bridge с PushNotificationChannel не может найти файл 'System.Runtime.WindowsRuntime' - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь разрешить приложению Desktop Bridge регистрироваться для уведомлений WNS из центра уведомлений Azure, но когда я фактически использую API-интерфейсы UWP, оно выдает

`System.IO.FileNotFoundException:« Не удалось загрузить файл или сборку »System.Runtime.WindowsRuntime, Версия = 4.0.10.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089 'или одна из его зависимостей. Система не может найти указанный файл. '

с внутренним исключением

FileNotFoundException: не удалось загрузить файл или сборку 'System.Runtime.WindowsRuntime, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089' или одна из ее зависимостей. Система не может найти указанный файл.

Я настроил свое решение, следуя инструкциям по упаковке Visual Studio . Мой пакетный проект имеет целевую версию Fall Creators Update, минимальную версию Anniversary Update, и я связал его с проектом Центра разработки Windows для поддержки WNS. Все мои проекты .NET Framework ориентированы на v4.6.2. Если я не вызываю API-интерфейсы UWP, упакованное приложение работает отлично.

Весь код WNS находится в одном проекте библиотеки классов, и на этот проект ссылается мое настольное приложение (которое добавляется в приложения пакета проекта). Библиотека классов содержит ссылки на все шесть файлов в Учебное пособие Microsoft , с Copy Local = False для трех файлов .winmd:

  • три DLL из C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5
  • C:\Program Files (x86)\Windows Kits\10\UnionMetadata\Facade\Windows.winmd
  • C:\Program Files (x86)\Windows Kits\10\References\10.0.16299.0\Windows.Foundation.UniversalApiContract\5.0.0.0\Windows.Foundation.UniversalApiContract.winmd
  • C:\Program Files (x86)\Windows Kits\10\References\10.0.16299.0\Windows.Foundation.FoundationContract\3.0.0.0\Windows.Foundation.FoundationContract.winmd

Фактическая функция push-уведомления находится внутри асинхронного метода:

public namespace WnsClassLibrary
{
    public class WnsChannelService
    {
        private PushNotificationChannel _channel;

        public async Task CreateChannel()
        {
            _channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
        }
    }
}

Когда приложение для настольного компьютера запускается, оно пытается вызвать CreateChannel() как нежелательный асинхронный метод, и именно тогда генерируется исключение - насколько я могу судить, оно даже фактически не делает его внутри метода.

Кто-нибудь знает, почему это происходит или как это исправить? Я попытался установить минимальную версию упаковочного проекта на Fall Creators Update, как предложено в приложении UWP: не удалось загрузить файл или сборку 'System.Runtime.WindowsRuntime, Version = 4.0.14.0 , но я все еще получаю то же исключение .

1 Ответ

0 голосов
/ 01 мая 2018

Похоже, что проблема на самом деле не в Desktop Bridge или ссылках UWP API, а в неверно сконфигурированном перенаправлении привязки сборки.

При попытке отобразить исключение в меньшем решении я обнаружил

<configuration>
  <!--[unrelated configuration data...]-->
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Runtime.WindowsRuntime" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

в файлах app.config для настольного приложения и библиотеки классов WNS. Удаление этого элемента <runtime> заставляет все работать нормально, а копирование / вставка его в мой проект воспроизведения приводит к появлению исключения System.IO.FileNotFoundException.

Я не могу понять, что добавило перенаправление привязки сборки или заставило его произойти снова, но приложение для настольного компьютера изначально было .Net 4.5 и потребовало много экспериментов, чтобы перейти на .Net 4.6.2, обновить все пакеты Nuget, и реализовать Desktop Bridge. Я думаю, что что-то могло вызвать автоматический конфигуратор Nuget?

...