Стандарт .net, пакет совместимости с Windows и реестр

У меня есть стандартная библиотека .net 2.0, которую я хочу использовать для доступа к реестру через пакет совместимости с Windows (если ОС, на которой он работает, - это Windows)

if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
     Console.WriteLine("On windows.");
     var dropFolder = Microsoft.Win32.Registry.GetValue(keyName: $@"{userRoot}\{subkey}", valueName: "DropFolder", defaultValue: @"C:\somepath");
     Console.WriteLine($"Drop folder is {dropFolder}");
 }

Это вылетает за исключением

Помощник по управляемой отладке 'BindingFailure': 'Сборке с отображаемым именем' Microsoft.Win32.Registry 'не удалось загрузить в контекст привязки' Load 'домена приложения с идентификатором 1. Причина сбоя: System.IO.FileNotFoundException: Не удалось загрузить файл или сборку Microsoft.Win32.Registry, Version = 4.1.1.0, Culture = нейтральный, PublicKeyToken = b03f5f7f11d50a3a или одну из его зависимостей. Система не может найти указанный файл.'

Я установил пакет nuget для совместимости с Windows в свой стандартный проект .net. Я также попытался установить пакет nuget Microsoft.Win32.Registry.

Ошибка сохраняется.

Если я закомментирую строки

var dropFolder = Microsoft.Win32.Registry.GetValue(keyName: $@"{userRoot}\{subkey}", valueName: "DropFolder", defaultValue: @"C:\somepath");
Console.WriteLine($"Drop folder is {dropFolder}");

Работает нормально.

Я ссылаюсь на стандартную библиотеку .net из библиотеки .net framework, поэтому нет возможности перейти на ядро ​​.net.

Стандартный cs proj .dot net

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Windows.Compatibility" Version="2.0.0" />
    <PackageReference Include="MQTTnet" Version="2.8.2" />
    <PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
    <PackageReference Include="RabbitMQ.Client" Version="5.1.0" />
  </ItemGroup>

</Project>

person Stuart    schedule 10.08.2018    source источник
comment
Вы установили пакет Microsoft.Windows.Compatibility также в свою библиотеку .NET Framework?   -  person mm8    schedule 10.08.2018
comment
Это исправило! Зачем это нужно было добавлять в проект .net framework !! @ mm8 Если вы добавите свой комментарий в качестве ответа, я отмечу его как решение.   -  person Stuart    schedule 10.08.2018
comment
Это не сбой, а просто уведомление от помощника по отладке. BindingFailure mda обычно выключен, он может выдавать ложные предупреждения о сборках с возможностью переназначения. Вам нужно исправить настройки отладки, пока не делайте ничего радикального. Отладка ›Windows› Параметры исключений, узел «Помощники по управляемой отладке». Если сейчас он отмечен галочкой, щелкайте, пока он не превратится в квадрат. Или, если необходимо, разверните узел и снимите флажок BindingFailure.   -  person Hans Passant    schedule 10.08.2018


Ответы (1)


Чтобы отсутствующий двоичный файл был включен в выходные данные вашего проекта .NET Framework, вы также должны установить пакет Microsoft.Windows.Compatibility в этом проекте. Или, по крайней мере, установите пакет Microsoft.Win32.Registry.

person mm8    schedule 10.08.2018