Ошибка Xaml при обращении к внутренним классам в сборке со строгим именем

У меня есть особая проблема, связанная с внутренними классами, используемыми в xaml.

Проблема заключается в следующем:

Мы решили строго назвать все наши сборки. После строгого именования все проекты, кроме одного, компилируются без сбоев под VS 2017. Ситуация следующая:

  • Assembly Company.Component - Компилирует без проблем и предоставляет свои внутренние компоненты следующим образом:

    [assembly: InternalsVisibleTo("Company.Component.Test, PublicKey={omitted}")]
    [assembly: InternalsVisibleTo("Company.OtherLibrary, PublicKey={omitted}")]
    
  • Assembly Company.Component.Test - Компилируется без проблем и может обращаться к внутренним компонентам Company.Component просто отлично. Все тесты проходят.
  • Company.OtherLibrary - вообще не компилируется из-за следующей ошибки в одном из файлов xaml:

    Only public or internal classes can be used within markup. 'Converter1' is not public or internal.
    

Рассматриваемый файл xaml можно увидеть ниже (с измененными именами):

<ns:class x:Class="Company.OtherLibrary.Class"
                   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
                   xmlns:converters="clr-namespace:Company.Component.Converters;assembly=Company.Component"
                   xmlns:viewModels="clr-namespace:Company.OtherLibrary.ViewModels"

                   xmlns:ns="clr-namespace:Company.Component;assembly=Company.Component"
                   mc:Ignorable="d"
                   d:DesignHeight="300" d:DesignWidth="300"
                   d:DataContext="{d:DesignInstance d:Type=viewModels:ViewModelClass}"
                   Style="{StaticResource  {x:Type ns:Style}}">
<UserControl.Template>
    <ControlTemplate>
        <DockPanel>
            <DockPanel.Resources>
                <converters:Converter1 x:Key="Converter1" />
                <converters:Converter2 x:Key="Converter2" />
                <converters:Converter3 x:Key="Converter3" />
                <converters:Converter4 x:Key="Converter4" />
            </DockPanel.Resources>
...
        </DockPanel>
    </ControlTemplate>
</UserControl.Template>

Теперь ответим на несколько вопросов:

  1. Открытый ключ - это правильный открытый ключ (не только токен) сборки OtherLibrary. Это фактически тот же самый, который используется для тестовой сборки.
  2. Имя сборки для OtherLibrary совпадает с именем в его свойствах.
  3. Код работал до сильного именования. Никаких изменений не было внесено ни в один файл кода в проектах (панель AssemblyInfo.cs). Я проверил с VS 2017 Git Сравнение. Отредактированные строки - те, которые показаны, и редактирование должно вставить открытые ключи.
  4. Пространства имен xaml иногда можно найти, а иногда нет. Это касается только пространств имен, которые не имеют общедоступных классов.
  5. Все преобразователи, видимые в ресурсах панели док-станции, являются внутренними компонентами в сборке Company.Component. Все они дают следующую ошибку:

    The type '{type}' is not accessible.
    
  6. Все библиотеки построены на одной и той же версии фреймворка / библиотеки.
  7. Ссылка на сборку для Company.Component имеет значение "copy local", установленное в значение true.

Что я пробовал

  1. Очистка теневого кеша xaml
  2. Очистка и восстановление.
  3. Изменение активной конфигурации сборки (как платформы, так и отладки / выпуска).
  4. Очистка всех каталогов bin и obj вручную для всех проектов.
  5. Перезапустил как компьютер, так и VS 2017.
  6. Все вышеперечисленное сразу.

Есть кое-что очень простое, что я, очевидно, упустил из виду. Может кто-нибудь помочь мне разобраться, что здесь происходит? Мне не разрешено (по не указанным причинам) изменять библиотеку компонентов, кроме как строго называть ее.

0 ответов

Другие вопросы по тегам