WPF 资源加载在 LoadFrom 加载上下文中失败

Posted

技术标签:

【中文标题】WPF 资源加载在 LoadFrom 加载上下文中失败【英文标题】:WPF resource loading fails in LoadFrom loading context 【发布时间】:2012-09-24 02:37:12 【问题描述】:

我有一个 WPF 程序集,我在本机代码的互操作场景中使用 LoadFrom 加载上下文,如下所示:

AppDomain.CreateInstanceFrom("c:\mydlls\mywpfstuff.dll", "myclass")

请注意,mydlls 与可执行文件所在的文件夹不同。这适用于我也加载的常规非 ui .NET dll,但是当我尝试执行此操作时出现错误。我附加了 AppDomain.CurrentDomain.AssemblyResolve 事件处理程序并获取了一个无法加载的事件。 ResolveEventArgs 中的名称为“mywpfstuff.resources”,RequestingAssembly 为空。我没有名为“mywpfstuff.resources”的文件,并且无法弄清楚如何解决自己的问题。

触发错误的代码行是 InitializeComponent();调用我的主用户控件构造函数。

在我看来,内部 XAML(BAML?)机制试图加载一些资源,但使用标准的 Load 上下文而不是 LoadFrom 上下文。

有没有办法解决这个问题,最好是让 WPF 使用 LoadFrom 上下文,或者如果这不可能,如何手动解决程序集?

【问题讨论】:

您在mywpfstuff 项目中(可能在Properties 文件夹中)有名称为Resources.resx 的文件吗?如果有,Build Action 有什么? 我不确定这很重要 - 您会看到在使用 AssemblyResolve 时尝试加载许多 dll(根据我的经验)。你对你的项目还有什么要补充的吗?“myclass”到底是什么? 当请求 mywpfstuff.resources 时,您是否尝试过从事件处理程序返回 mywpfstuff 程序集? 【参考方案1】:

由于本地化问题和缺少 resx,我过去也遇到过类似的问题。

如果 XAML 使用来自该程序集的资源,请仔细检查 UI 区域性的资源是否确实在 c:\mydlls正确子文件夹中可用.

【讨论】:

【参考方案2】:

我在创建 Unused References – VS2010 Add-in – top to bottom 时遇到了类似的情况。

问题是资源已经加载,不能重新加载其他资源。

希望这会有所帮助...

我创建了一个要访问的 Start 方法:

public static void Start()

    if (Application.Current == null)
    
        // create the Application object
        App a = new App();
        var l = a.Resources["Locator"] as Locator;
        // do something with l
        a.Run();
    
    else
    
        var locator = new Locator();
        // do something with l
        Application.Current.Resources.Remove("Locator");
        Application.Current.Resources.Add("Locator", locator);
        MainWindow main = new MainWindow();
        main.Show();
    

【讨论】:

以上是关于WPF 资源加载在 LoadFrom 加载上下文中失败的主要内容,如果未能解决你的问题,请参考以下文章

LoadFrom 和上下文

什么是 .NET 程序集中的融合

如果在 Windows 服务 .net 可执行文件中调用 .NET Assembly.Load/LoadFrom 会失败

从外部文件或程序集加载 WPF 样式或其他静态资源

VS2010 WPF 加载不了设计视图的问题,代码是正常的,但是视图加载不出来

使用上下文加载器加载资源失败并出现 NullPointerException