代码之家  ›  专栏  ›  技术社区  ›  Chry Cheng

WPF中用户控件实例化时PresentationFramework.dll中的System.IO.IOException

  •  5
  • Chry Cheng  · 技术社区  · 16 年前

    我有一个用户控件UserControl,它在程序集程序集中。我有一个WPF应用程序,它以编程的方式实例化用户控件。我已经添加了对程序集的引用。但是,在运行时,我得到了FF。例外:

    Cannot locate resource 'usercontrol.xaml'.
       at MS.Internal.AppModel.ResourcePart.GetStreamCore(FileMode mode, FileAccess access)
       at System.IO.Packaging.PackagePart.GetStream(FileMode mode, FileAccess access)
       at System.IO.Packaging.PackagePart.GetStream()
       at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
       ...
    

    我将usercontrol.xaml的生成操作更改为embeddedresource,但这导致了编译问题,因此我将其放回默认页面设置。我在.NET 3和4中尝试过这种方法,但没有用。有人知道吗?

    2 回复  |  直到 8 年前
        1
  •  6
  •   Ray Burns    16 年前

    最常见的原因是如果重命名程序集。我将解释这个场景,然后给出一些其他的可能性。

    假设您有一个包含usercontrol“mycontrol”的dll项目“abc”。在abc.dll中为mycontrol生成的initializecomponent将包含uri“/abc;component/mycontrol.xaml”。

    在运行时,将提取程序集名称“abc”,并按该名称搜索加载的程序集。如果找到这样的程序集,但它没有“mycontrol.xaml”资源,则会得到您在问题中发布的错误。

    下面是场景:

    • 将abc.dll文件重命名为def.dll
    • 您(或某人)创建了另一个abc.dll文件
    • 在项目中引用def.dll(编译为abc.dll)
    • 您的项目还直接或间接引用abc.dll,以便在实例化mycontrol时加载它。

    现在,当您从def.dll实例化mycontrol时,它会在abc.dll程序集中而不是def.dll程序集中查找其XAML。

    可能发生这种情况的其他一些情况:

    • 在obj目录中有一个过时的.g.cs文件,该文件的xaml文件名错误。如果您在不更新日期的情况下更改了源代码,则可能会发生这种情况(这可能发生在从源代码管理系统签出或解压缩zip文件或其他许多方法时)。清洁和重建解决方案可以解决这个问题。因为你的评论说你尝试过这个,这不适用于你。

    • 您正在编译.dll文件后手动编辑该文件中的资源名

    • 您已经加载了两个同名的程序集(是的,这是可能的),资源加载程序发现了错误的程序集。

    请注意,如果.g.cs文件与资源中的路径不匹配,则对xaml文件路径的任何更改(例如重命名或移动该文件)都可能导致此问题。

    为了进一步诊断您的问题,我建议您下载一份NetReflector副本并查看.dll文件以查看:

    1. initializecomponent()指定了什么URI?
    2. 是否有同名的.baml文件?

    您还可以在引发异常的点检查调用堆栈,以确保正在使用的资源管理器引用了预期的程序集,而不是其他程序集。

        2
  •  1
  •   Hossein Narimani Rad    8 年前

    在将所有WPF窗口移动到项目中名为“Windows”的新文件夹后,出现了此错误。我通过转到“app.xaml”并将主窗口路径更新为:

    StartupUri="Windows\MainWindow.xaml"