1

我在使用 F#、FsXaml 和 Elmish.WPF 构建的 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 的控件实例。
  • 但是,没有使用 C1.WPF.4.dll 中的任何类型的 F# 代码。
  • 因此,正如 IL Spy 所证实的,Views.dll 不包含对 C1.WPF.4.dll 的引用。
  • 因此,当我构建 App.exe 时,输出文件夹中不包含 C1.WPF.4.dll。
  • 因此,我得到一个运行时错误。

虽然我可以在我的 App 项目中包含对 C1.WPF.4.dll 的引用,但我宁愿不这样做。

有一个更好的方法吗?

4

1 回答 1

0

要让它工作:

  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 可以找到要实例化的类。

  1. 在 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 的引用”。

于 2019-03-16T21:47:04.377 回答