WPF DLL 构建正确但在使用时导致错误
WPF DLL builds correctly but causes errors when used
我在 Visual Studio 2017 年,使用 .Net 4.6.1
我制作了一个 WPF 样式、控件、转换器等库(在项目 A 中),供构建应用程序时使用。我们的想法是,如果公司品牌发生变化,我们可以重新发布该库,所有引用它的应用程序都将重新命名。
项目 A 没有错误或警告,可以正确生成 .dll 文件。
然而,当我在项目 B 中引用 .DLL 时,引用某些 .DLL 组件的 xaml 永远给出 Loading designer... You can continue working while the designer is loading in the background
消息。当我尝试启动项目 B 时,它告诉我它处于中断模式,带有 System.WhosebugException
就是这样。
我尝试在 app.xaml 文件中添加和删除行:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Colours.xaml"/>
<ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Brushes.xaml"/>
<ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Text.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
这样做给了我一个提示,也许是因为只有一些参考(或者可能有太多参考?)导致设计器失败,但我很难找到发生了什么事.
你知道我应该如何调试这个问题吗?假设项目 A(问题出现的地方)构建正确?例如,是否有可能在设计时发现问题的提示或技巧或额外工具?
或者,欢迎任何有关如何检查项目 B 中的所有内容的建议。我已经检查了所有的引用、命名空间和资源字典,并确信语法是正确的,但也许我可能错过了一个陷阱?
所以,事实证明这是您在周末离开时遇到的烦人问题之一,当您 return 它改变了外观。我回来了,再也无法得到堆栈溢出错误。
报告的错误是项目 A 中的用户控件未能找到同一项目中内置的资源之一。我能够通过将合并字典中的引用从标准格式更改为 Pack URI 格式来解决此问题(本地路径引用仅在项目本身中查看时有效 - 它们在 DLL 中失败)。来自:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Styles/Buttons.xaml"/>
<ResourceDictionary Source="/Styles/Gradients.xaml"/>
<ResourceDictionary Source="/Styles/Text.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
对此:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Buttons.xaml"/>
<ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Gradients.xaml"/>
<ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Text.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
从中我了解到 - 本地引用仅在资源字典之间的 DLL 中本地工作;如果您希望使用 DLL 中的 UserControl,则必须使用 pack 格式。以后我会在所有不会导致语法错误的地方使用 Pack URI!
我在 Visual Studio 2017 年,使用 .Net 4.6.1
我制作了一个 WPF 样式、控件、转换器等库(在项目 A 中),供构建应用程序时使用。我们的想法是,如果公司品牌发生变化,我们可以重新发布该库,所有引用它的应用程序都将重新命名。
项目 A 没有错误或警告,可以正确生成 .dll 文件。
然而,当我在项目 B 中引用 .DLL 时,引用某些 .DLL 组件的 xaml 永远给出 Loading designer... You can continue working while the designer is loading in the background
消息。当我尝试启动项目 B 时,它告诉我它处于中断模式,带有 System.WhosebugException
就是这样。
我尝试在 app.xaml 文件中添加和删除行:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Colours.xaml"/>
<ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Brushes.xaml"/>
<ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Text.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
这样做给了我一个提示,也许是因为只有一些参考(或者可能有太多参考?)导致设计器失败,但我很难找到发生了什么事.
你知道我应该如何调试这个问题吗?假设项目 A(问题出现的地方)构建正确?例如,是否有可能在设计时发现问题的提示或技巧或额外工具?
或者,欢迎任何有关如何检查项目 B 中的所有内容的建议。我已经检查了所有的引用、命名空间和资源字典,并确信语法是正确的,但也许我可能错过了一个陷阱?
所以,事实证明这是您在周末离开时遇到的烦人问题之一,当您 return 它改变了外观。我回来了,再也无法得到堆栈溢出错误。
报告的错误是项目 A 中的用户控件未能找到同一项目中内置的资源之一。我能够通过将合并字典中的引用从标准格式更改为 Pack URI 格式来解决此问题(本地路径引用仅在项目本身中查看时有效 - 它们在 DLL 中失败)。来自:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Styles/Buttons.xaml"/>
<ResourceDictionary Source="/Styles/Gradients.xaml"/>
<ResourceDictionary Source="/Styles/Text.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
对此:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Buttons.xaml"/>
<ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Gradients.xaml"/>
<ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Text.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
从中我了解到 - 本地引用仅在资源字典之间的 DLL 中本地工作;如果您希望使用 DLL 中的 UserControl,则必须使用 pack 格式。以后我会在所有不会导致语法错误的地方使用 Pack URI!