Исправить исключение XamlObjectWriterException, не удается создать неизвестный тип в F #, FsXaml, приложении WPF? - PullRequest
0 голосов
/ 17 марта 2019

Я получаю эту ошибку в приложении WPF, созданном с использованием F #, FsXaml и Elmish.WPF.

System.Xaml.XamlObjectWriterException:
Cannot create unknown type '{http://schemas.componentone.com/winfx/2006/xaml}C1ProgressIndicator'.
at System.Xaml.XamlObjectWriter.WriteStartObject(XamlType xamlType)
at FsXaml.InjectXaml.from(String file, Boolean loadFromResource, Object root)
  • Проект Views содержит XAML и содержит ссылку на C1.WPF.4.dll.
  • XAML объявляет экземпляр элемента управления из C1.WPF.4.dll.
  • Однако нет кода F #, который бы использовал какие-либо типы из C1.WPF.4.dll.
  • Следовательно, Views.dll не содержит ссылку на C1.WPF.4.dll, что подтверждается IL Spy.
  • Следовательно, при сборке App.exe файл C1.WPF.4.dll не включается в выходную папку.
  • Следовательно, я получаю ошибку во время выполнения.

Хотя я мог бы включить ссылку на C1.WPF.4.dll в свой проект приложения, я бы не стал.

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 17 марта 2019

Чтобы заставить это работать:

  1. В вашем файле XAML замените пространство имен XAML пространством имен CLR.Например, вместо xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml" используйте что-то вроде xmlns:c1="clr-namespace:C1.WPF;assembly=C1.WPF.4".

Это необходимо, поскольку при запуске App.exe он еще не загружал библиотеку элементов управления.В библиотеке элементов управления атрибут создает отображение из пространства имен XAML в пространство имен CLR.Явно указав пространство имен CLR и сборку, XamlReader может найти класс для создания экземпляра.

Создать фиктивный экземпляр в коде Views.Экземпляр-пустышка - это экземпляр чего-то из библиотеки элементов управления.Это создает зависимость в Views.dll от библиотеки элементов управления.

// force the compiler to add a reference to C1.WPF.4.dll
let private forceC1DllReference = C1.WPF.Anchor.TopLeft

type MainWindowView = XAML< "MainWindow.xaml" >

Этот второй выглядит как хак.Интересно, есть ли лучший способ сказать: «Пожалуйста, добавьте ссылку на эту DLL, даже если я не использую типы из нее».

...