我有一个用户控件UserControl,它位于程序集Assembly中。我有一个WPF应用程序,它以编程方式实例化UserControl。我已经添加了对Assembly的引用。但是,在运行时我得到了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中尝试过这一点无济于事。有人有任何想法吗?
答案 0 :(得分:6)
最常见的原因是重命名程序集。我会解释那个场景,然后给出其他一些可能性。
假设您有一个包含UserControl“MyControl”的DLL项目“Abc”。在Abc.dll中为MyControl生成的InitializeComponent将包含Uri“/Abc;Component/MyControl.xaml”。
在运行时,将提取程序集名称“Abc”,并按该名称搜索已加载的程序集以获取程序集。如果找到这样的程序集但它没有“MyControl.xaml”资源,则会收到您在问题中发布的错误。
所以这是场景:
现在,当您从Def.dll实例化MyControl时,它会在Abc.dll程序集中查找其xaml而不是Def.dll程序集。
可能发生这种情况的其他一些情况:
您的obj目录中有一个陈旧的.g.cs文件,该文件的xaml文件名称错误。如果您更改源代码而不更新日期(这可能发生在从源控制系统签出或解压缩zip文件或许多其他方式时),则会发生这种情况。清理和重建解决方案将解决这个问题。由于您的评论说您试过这个,这不适用于您。
编译完成后,您手动编辑.dll文件中的资源名称
您已经加载了两个具有相同名称的程序集(是的,这是可能的),并且资源加载程序发现错误的
请注意,如果.g.cs文件与资源中的路径不匹配,对XAML文件路径的任何更改(例如重命名或移动它)都可能导致此问题。
为了进一步诊断您的问题,我建议您下载一份NET Reflector并查看.dll文件以查看:
您还可以在抛出异常的位置检查调用堆栈,以确保正在使用的资源管理器具有对预期程序集的引用,而不是其他程序集。
答案 1 :(得分:1)
将所有WPF窗口移动到名为“Windows”的项目中的新文件夹后,出现此错误。我通过转到“App.Xaml”并将主窗口路径更新为:
来更正错误StartupUri="Windows\MainWindow.xaml"