FsXaml 可以在 F# 解释脚本中使用吗?

Can FsXaml be used in an F# interpreted script?

我刚刚将其中一个 FsXaml 演示程序转换为解释型 F# 脚本,以便我可以对其进行试验和学习。它不会 运行,解释器给了我以下错误信息:

System.NotSupportedException: The invoked member is not supported in a dynamic assembly.
at System.Reflection.Emit.InternalAssemblyBuilder.GetManifestResourceStream(String name)
at FsXaml.InjectXaml.from(String file, Object root)
at FsXaml.App.InitializeComponent() at FsXaml.App..ctor()
at FSI_0002.main[a](a argv) in C:\Users\bobmc\OneDrive\FSharp\Learning\WPFExamples\FsXaml\demos\WpfSimpleMvvmApplication\WPFApp.fsx:line 104
at .$FSI_0002.main@() in C:\Users\bobmc\OneDrive\FSharp\Learning\WPFExamples\FsXaml\demos\WpfSimpleMvvmApplication\WPFApp.fsx:line 109

我可以将 F# 解释器与 FsXaml 一起使用吗?感谢大家的帮助。

遗憾的是,WPF 和脚本不能很好地协同工作。

异常发生在 WPF 运行时本身 - FsXaml.InjectXaml 正在使用 XamlObjectWriter 用 XAML 文件中的内容填充类型。如果您使用的是动态程序集(如 FSI),则此类型不起作用,不幸的是,这意味着 FsXaml 可能永远无法在 FSI 中工作。

话虽如此,即使有办法解决这个问题,它的用处也非常有限。 WPF 也有一些限制,使其无法很好地处理脚本方案,例如 "only one application can ever be created within a given AppDomain" 限制。那个使它如此关闭 "main" (第一个)window 使它如此你永远无法打开另一个。因此,我没有优先尝试在 FSI 中完成这项工作。

如果有人知道如何使 FsXaml 在 FSI 上下文中更好地发挥作用,我很乐意接受贡献,但目前,我没有看到适合该使用场景的好的解决方案。

编辑: FsXaml 3.1.6 现在包含的功能使这变得更加容易。如果您不关闭主 window 或使用对话框,它运行良好。有一个演示 application/script 对此进行了说明。