WPF DLL正确生成,但使用时会导致错误

时间:2019-04-26 14:33:50

标签: wpf xaml dll resourcedictionary

我正在使用.Net 4.6.1在Visual Studio 2017中

我(在项目A中)建立了一个WPF样式,控件,转换器等的库,供在构建应用程序时使用。这个想法是,如果公司的品牌发生变化,我们可以重新发布该库,所有引用该库的应用程序都将被重新命名。

项目A没有错误或警告,并且可以正确构建以制作.dll文件。

但是,当我在项目B中引用.DLL时,引用某些.DLL组件的xaml会永远显示Loading designer... You can continue working while the designer is loading in the background消息。当我尝试启动Project B时,它告诉我它处于中断模式,带有System.StackOverflowException就是这样。

我尝试在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>

这样做给了我一个提示,也许是因为只有一些引用(或者引用太多?)会导致设计器失败,但是我很难过一段时间来寻找正在发生的事情。 / p>

考虑到问题A所在的项目A是否正确构建,您是否知道如何调试该问题?例如,在设计时可能发现问题的任何技巧或窍门或其他工具?

或者,也欢迎任何有关如何检查项目B中所有内容的建议。我检查了所有引用,名称空间和资源字典,并确信语法正确,但是也许我可能错过了一个陷阱?

1 个答案:

答案 0 :(得分:0)

因此,事实证明,这是您在周末离开的那些烦人的问题之一,当您返回时,它已经改变了外观。我回来了,再也找不到堆栈溢出错误。

报告的错误是项目A中的UserControl无法找到同一项目中内置的资源之一。我可以通过将合并字典中的引用从标准格式更改为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 URI!