c# - 为什么我需要 'dummy' 行代码才能加载PresentationFramework?

标签 c# wpf xaml

我有一个非托管应用程序,它的某些用户界面使用 WPF 程序集。

最初我遇到了如下异常:

System.IO.FileNotFoundException was unhandled Message: Could not load file or assembly 'PresentationFramework ...

(与 Changed framework version results in: Could not load file or assembly PresentationFramework? 的原因不同)。

PresentationFramework 是我的程序集的引用。

我通过添加一行 C# 代码来解决这个问题,该代码似乎强制或欺骗编译器/运行时加载 DLL:

// Refers to an arbitrary enum in PresentationFramework.Classic.dll
var dummy = Microsoft.Windows.Themes.ClassicBorderStyle.None;

然后我在运行时没有遇到异常。

否则,对该 DLL 中任何内容的唯一引用是在 XAML 中。具体来说:

<ResourceDictionary Source="pack://application:,,,/PresentationFramework.Classic;component/themes/Classic.xaml"/>

但显然这个 XAML 引用不足以让 DLL 在运行时正确加载。

<小时/>

这个“虚拟”解决方案很好,因为它确实有效,但我不明白为什么这是必要的,它让我觉得我错过了一些更重要的东西。

这是正确的解决方法吗?首先有必要这样做的原因是什么?

最佳答案

XAML 和 C# 是两种不同的语言,具有单独的解析器和编译器。事实上,早期的调试器对 XAML 运行时错误的支持“不存在”。如果您遇到 XAML 编译器错误怎么办? C# 编译器将仅使用最后一个有效的 XAML 编译。

虽然您可能永远不会使用它,但完全有可能在运行时动态加载 XAML 设计:https://blogs.msmvps.com/bsonnino/2016/07/21/loading-xaml-dynamically-part-1-loading-views-dynamically/

此时编译器不能依赖在编译时 XAML 中编写的内容。

XAML 中的命名空间?它们只是将 .NET 类纳入 XAML 解析器的范围。它们对于代码的 C# 部分并没有那么重要。

关于c# - 为什么我需要 'dummy' 行代码才能加载PresentationFramework?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60172678/

相关文章:

wpf - 有什么办法可以提取底层Xaml吗?

c# - 将矩阵数组绑定(bind)到 WPF DataGrid

c# - 编译错误 : CS0433 type in conflict with imported type

c# - 如何在打印 PDF 时设置打印机设置

c# - 如何在 Azure 中搜索包含引号(转义单引号)的文本?

wpf - ItemContainerGenerator.ContainerFromItem() 返回 null?

wpf - 设置与主题样式不同的本地隐式样式/替代基于动态资源

c# - 用于检索所有记录的 Elasticsearch 搜索查询 NEST

.Net DataBinding 具有值类型属性的新对象

c# - 从 ListBoxItem 获取 ListBox 对象