【问题标题】:System.Exception in InitializeComponent()?InitializeComponent() 中的 System.Exception?
【发布时间】:2010-11-19 11:28:23
【问题描述】:

我有一个奇怪的问题正在给我们带来麻烦。

我们有一个简单的 C# Wpf UserControl。它是一个进度条——没什么花哨的——只是一个根据对 Value 和 MaxValue 的绑定来改变大小的边框。它在 99% 的情况下都能正常工作,我们在代码中的十几个地方都使用它——包括启动画面。

它在初始屏幕中总是可以正常工作 - 所以它总是在我们的应用程序中加载和工作。

问题在于,有时(我们无法预测或理解何时)进度条构造函数中的 InitializeComponent() 调用会引发 System.Exception。查看编译期间创建的progressbar.g.cs 文件(obj/Debug 文件夹),我可以看到由于找不到progressbar.xaml 文件而引发了异常。当然,我没有更改 g.cs 文件中的任何代码,也没有在这个 UserControl 中做任何花哨的事情。

System.Exception: The component 'MyProject.ControlLibrary.ProgressBar' does not have a resource identified by the URI '/MyProject.ControlLibrary;component/progressbar.xaml'. at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) at MyProject.ControlLibrary.ProgressBar.InitializeComponent() in d:\Projectfolder\MyProject.ControlLibrary\ProgressBar.xaml:line 1 at MyProject.ControlLibrary.ProgressBar..ctor() in D:\projectfolder\MyProject.ControlLibrary\ProgressBar.xaml.cs:line 26 at ProjectName.UI.VideoViewer..ctor() in D:\projectfolder\UI\VideoViewer.xaml.cs:line 26 Source: PresentationFramework

我不明白为什么 progressbar.xaml 资源有时会丢失,尤其是考虑到它在应用程序运行时至少一次总是可以正常工作。

UserControl 包含在名为 MyProject.ControlLibrary.dll 的项目中。该项目似乎配置正确,因为它包含其他没有显示任何问题的用户控件 - 除了另一个具有相同问题的类似 UserControl。

我对此没有任何想法 - 所以任何建议都会有所帮助。我正在使用 VisualStudio 2008 和 .net 3.5

【问题讨论】:

    标签: c# wpf xaml user-controls


    【解决方案1】:

    This Post 似乎是对该问题的最佳讨论。简短的回答表明您的用户控件可能已加载到两个不同的程序集中。长答案是有很多人遇到了这个错误,不清楚他们是否找到了一致的解决方案/解决方法。有人说MS可能在4.0中修复了这个问题

    【讨论】:

    • 谢谢。有点令人沮丧。
    【解决方案2】:

    可能已经解决了这个问题 - 我会在这里解释这个问题,以防其他人遇到它。

    我们代码的一部分从插件文件夹动态加载插件。为此,它会为 plugins 文件夹中的所有 .dll 文件执行 Assembly.LoadFile(filename)。

    它检查 dll 是否实现了我们的插件接口;如果是,它会加载它,如果不是,它不会。我们的插件接口包含在一个名为 MyProject.Interfaces.dll 的文件中,该文件以及 MyProject.ControlLibrary.dll 也在插件的文件夹中。

    因此,代码有时会调用 MyProject.ControlLibrary.dll 上的 Assembly.LoadFile 两次,因为它会在插件文件夹中的 dll 中循环。似乎在第二个 LoadFile 之后,xaml 资源丢失了。当我阻止第二次加载时,它似乎解决了问题。

    【讨论】:

      【解决方案3】:

      我也想补充一点关于这个话题的信息。

      我也在使用插件式应用程序,每个程序集都加载到自己的 AppDomain 中,但首先我加载程序集以查看它是否是以及我需要实例化什么类。

      为此,我曾经使用Assembly.Load(File.ReadAllBytes(file));。如果我在实例化窗口之前这样做了,那么 InitializeComponent() 会抛出错误。

      如果我先实例化窗口然后加载程序集,一切正常。 虽然窗口可以随时打开和关闭,但大多数时候这些程序集已经加载完毕。

      我为解决这个问题所做的是首先创建一个单独的 AppDomain,然后使用以下命令在该 appdomain 中加载程序集:Assembly asm = PrivateAssemblyLoader.Load(File.ReadAllBytes(file));

      这样当前的 AppDomain 就不会被加载的程序集所阻碍。

      (在我的插件应用程序中,我在执行目录中查找所有 .exe 和 .dll 文件,因此它也可以自行加载。)

      【讨论】:

        猜你喜欢
        • 2018-03-18
        • 2011-01-12
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        • 2015-05-28
        • 1970-01-01
        • 2017-08-13
        • 1970-01-01
        相关资源
        最近更新 更多