Ошибка 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>
Теперь ответим на несколько вопросов:
- Открытый ключ - это правильный открытый ключ (не только токен) сборки OtherLibrary. Это фактически тот же самый, который используется для тестовой сборки.
- Имя сборки для OtherLibrary совпадает с именем в его свойствах.
- Код работал до сильного именования. Никаких изменений не было внесено ни в один файл кода в проектах (панель AssemblyInfo.cs). Я проверил с VS 2017 Git Сравнение. Отредактированные строки - те, которые показаны, и редактирование должно вставить открытые ключи.
- Пространства имен xaml иногда можно найти, а иногда нет. Это касается только пространств имен, которые не имеют общедоступных классов.
Все преобразователи, видимые в ресурсах панели док-станции, являются внутренними компонентами в сборке Company.Component. Все они дают следующую ошибку:
The type '{type}' is not accessible.
- Все библиотеки построены на одной и той же версии фреймворка / библиотеки.
- Ссылка на сборку для Company.Component имеет значение "copy local", установленное в значение true.
Что я пробовал
- Очистка теневого кеша xaml
- Очистка и восстановление.
- Изменение активной конфигурации сборки (как платформы, так и отладки / выпуска).
- Очистка всех каталогов bin и obj вручную для всех проектов.
- Перезапустил как компьютер, так и VS 2017.
- Все вышеперечисленное сразу.
Есть кое-что очень простое, что я, очевидно, упустил из виду. Может кто-нибудь помочь мне разобраться, что здесь происходит? Мне не разрешено (по не указанным причинам) изменять библиотеку компонентов, кроме как строго называть ее.