【问题标题】:Fix XamlObjectWriterException, Cannot create unknown type in F#, FsXaml, WPF app?修复 XamlObjectWriterException,无法在 F#、FsXaml、WPF 应用程序中创建未知类型?
【发布时间】:2019-03-16 21:44:39
【问题描述】:

我在使用 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 的引用,但我宁愿不这样做。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 虽然该问题并非真正特定于 FsXaml 和 Elmish WPF,但与当前其他替代技术相比,这些技术更有可能发生。

标签: wpf fsxaml elmish-wpf


【解决方案1】:

要让它工作:

  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 运行时,它可能尚未加载控件库。 an attribute 在控件库中创建从 XAML 命名空间到 CLR 命名空间的映射。通过显式声明 CLR 命名空间和程序集,XamlReader 可以找到要实例化的类。

  1. 在视图代码中创建一个虚拟实例。虚拟实例是控件库中某些东西的实例。这会在 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 的引用,即使我没有使用其中的类型。”

【讨论】:

  • 那么你有 FsXaml 和 Elmish.WPF 一起工作吗?我有兴趣一起使用它们,但还没有尝试过。
  • @TysonWilliams 是的,我这样做是为了证明概念。还没有部署应用的经验。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 2019-09-08
  • 2016-11-19
  • 2011-09-03
相关资源
最近更新 更多