C# 将URI打包到引用程序集中的资源

C# 将URI打包到引用程序集中的资源,c#,wpf,xaml,C#,Wpf,Xaml,我已经为这件事绞尽脑汁了一段时间了,但看在上帝的份上,我就是不知道我的uri出了什么问题。也许有人能帮忙 我正在为第三方软件开发加载项(意味着我无法访问App.config,也无法修改应用程序本身)。加载项位于与exe文件位置不同的文件夹中。我在MyAddin.View.dll中有一个wpf窗口。最近,我决定将所有WPF资源移动到一个单独的程序集中(称为UI.Shared)。我添加了UI.Shared.dll作为对MyAddin.View.dll的引用,还将MyAddin.View.dll窗口中

我已经为这件事绞尽脑汁了一段时间了,但看在上帝的份上,我就是不知道我的uri出了什么问题。也许有人能帮忙

我正在为第三方软件开发加载项(意味着我无法访问App.config,也无法修改应用程序本身)。加载项位于与exe文件位置不同的文件夹中。我在MyAddin.View.dll中有一个wpf窗口。最近,我决定将所有WPF资源移动到一个单独的程序集中(称为UI.Shared)。我添加了UI.Shared.dll作为对MyAddin.View.dll的引用,还将MyAddin.View.dll窗口中的包uri修改为:

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary
         Source="pack://application:,,,/UI.Shared;component/Styles/Styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

</Window.Resources>

我已确保Style.xaml构建操作设置为Resource。UI.Shared.dll与MyAddin.View.dll位于同一文件夹中(但两者都与应用程序可执行文件位于同一文件夹中)。在设计阶段,一切正常。但在运行时,我得到:

“设置属性”System.Windows.ResourceDictionary.Source“引发了异常。”

内部异常是:

无法加载文件或程序集“UI.Shared,Culture=neutral”或其依赖项之一。系统找不到指定的文件。

在我将资源移动到单独的程序集中之前,一切都正常:(.有人能帮忙吗?

您的URI很好

从VBA调用WPF windows时,我遇到了类似的问题:WPF无法找到引用的资源,因为主进程是从其他目录启动的。我找到的解决方案可能对您的情况也很有用:

  • 将事件处理程序附加到。如果未找到程序集,则在外接程序目录中搜索它
以下是一些(未经测试的)C#示例代码,灵感来自我们在生产中使用的一些VB.NET代码:

// Do this when your add-in starts
var addinAssembly = Assembly.GetExecutingAssembly();

AppDomain.CurrentDomain.AssemblyResolve += (sender, e) =>
{
    var missing = new AssemblyName(e.Name);

    // Sometimes the WPF assembly resolver cannot even find the executing assembly...
    if (missing.FullName == addinAssembly.FullName)
        return addinAssembly;

    var addinFolder = Path.GetDirectoryName(addinAssembly.Location);
    var missingPath = Path.Combine(addinFolder, missing.Name + ".dll");

    // If we find the DLL in the add-in folder, load and return it.
    if (File.Exists(missingPath))
        return Assembly.LoadFrom(missingPath);

    // nothing found
    return null;
};

嗯,这是可行的,但我希望会有一个更干净的解决方案。如果没有,我会将此标记为答案。这是我见过的AssemblyResolve最干净的实现。:)