C# 从WPFapplication创建的可运行Dll不';找不到引用的资源字典

C# 从WPFapplication创建的可运行Dll不';找不到引用的资源字典,c#,wpf,xaml,dll,resourcedictionary,C#,Wpf,Xaml,Dll,Resourcedictionary,我已经搜索了一段时间,没有找到解决具体问题的方法 首先,我开发了一个WPF应用程序,其中包含多个项目和用户控件,在多个项目中使用同一个ResourceDictionary。因此,我在一个单独的项目中获取了资源字典,仅保存dictionary.xaml: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://sc

我已经搜索了一段时间,没有找到解决具体问题的方法

首先,我开发了一个WPF应用程序,其中包含多个项目和用户控件,在多个项目中使用同一个ResourceDictionary。因此,我在一个单独的项目中获取了资源字典,仅保存dictionary.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:WPFGlobalResources;assembly=WPFGlobalResources"
                >

<!--Here are placed some styles I use globally -->    
这里我只需要第二种方法,正如你所看到的。我原来的项目在这里抛出了一些错误,因此我尽可能地减少了问题,只使用了包含WPFGlobalResources的项目和一个包含几乎空的主窗口(包含一个按钮)的项目,使用了字典中的样式,并引用了字典中的项目

只要我在main window.xaml的开头注释掉mergedDictionary的调用,一切都正常(当然我没有buttonstyle)。 如果我尝试使用ResourceDictionary,我的CAD程序在调用DLL时崩溃,调试器会导致错误:(希望我翻译正确)

IOException-其他信息:Assembly.GetEntryAssembly()返回NULL。定义Application.ResourceAssembly-Property或使用语法“pack://application:,,,/assemblyname;component/“以定义应从中加载资源的程序集

好的,然后我添加了
Application.resourcesassembly=typeof(MainWindow.Assembly)就在新应用程序()后面。现在调试器前进了一点,但再次停止,出现错误:

MainWindow.xaml linenumer12中出现异常…->找不到InnerException{“文件或程序集\“WPFGlobalResources,区域性=中性\”或其依赖项。系统找不到指定的文件。“:“WPFGlobalResources,区域性=中性”}System.Exception{System.IO.FileNotFoundException}

我也试着补充一下

System.Uri resourceLocater = new System.Uri("/MainApplication;component/VisiDockedMainWindow.xaml", System.UriKind.Relative);

System.Windows.Application.LoadComponent(resourceLocater);
但没有成功,仍然是同样的错误

现在我找不到一个解决办法来让它工作。有没有可能pack://application... 现在将我的CAD程序作为应用程序,而不是我的DLL的一部分,WPFGlobalResources.DLL(以及其他所有DLL)位于哪里?我怎样才能改变这一点,我在MSDN中找不到这个用例的URI


接下来我要尝试的是转储我的WPFGlobalResources并将样式添加到每个窗口/用户控件,但我希望这不是唯一的解决方案???产生大量冗余代码…

好的,在尝试了很多之后,我同时找到了一个解决方案:

关键是,在执行主窗口的xaml代码时,似乎没有加载引用。解决方案只是添加一个:

Assembly resAssembly = Assembly.Load("WPFGlobalResources");
在使用app.Run之前。 这似乎预加载了外部引用,然后就可以找到它了

有趣的提示:在这种情况下,最好不要对WPF应用程序进行任何更改(仍然可以通过App.xaml文件执行),而是添加一个额外的类库项目来创建dll。然后,您可以添加一个启动WPF应用程序的类(当然,您必须首先引用WPF项目和ResourceDictionary项目):

现在它终于起作用了:-)

Assembly resAssembly = Assembly.Load("WPFGlobalResources");
public class Exec
{

    public short vcExtStartUp(ref string Directory, string ExtensionName)
    {
        return 1;

    }

    public short vcExtMenuExec(ref int MenuID)
    {
        Thread thread = new Thread(() =>
        {
            WpfTestAppl.App app = new WpfTestAppl.App();

            // Loading of ResourceAssemblys                
            Assembly resAssembly = Assembly.Load("WPFGlobalResources");


            app.Run(new WpfTestAppl.MainWindow());

        });
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();

        return 1;
    }
}