首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从WPFapplication创建的可运行Dll找不到引用的ResourceDictionary

从WPFapplication创建的可运行Dll找不到引用的ResourceDictionary
EN

Stack Overflow用户
提问于 2017-02-16 10:00:31
回答 1查看 208关注 0票数 0

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

首先,我开发了一个包含多个项目的WPF应用程序,并在多个项目中使用相同的UserControls使用相同的ResourceDictionary。因此,我将资源字典放在一个单独的项目中,只保存dictionary.xaml:

代码语言:javascript
运行
复制
<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 -->    

在我的许多Windows和UserControls中,我引用了项目中的WPFGlobalResources并添加了

<Window.Resources> or UserControl.Resources <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/WPFGlobalResources;component/GlobalWpfResources.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Window.Resources>

在xamls一开始。

只要我在使用可执行应用程序,一切都可以正常工作,所有资源都可以加载。

现在,我需要一个可运行的Dll版本的这个应用程序来注册它在Windows注册表。为了做到这一点,我将App.xaml从我的项目中抛出,并将其转化为类库,就像我在许多googlesite中描述的那样。

在那里注册后,我可以从一个CAD(程序)中调用它--在这个程序中,它使用调用DLL MainApplication.exec 1,wich需要在我的DLL-Project中使用以下方法来获得一个新的EntryPoint(我为此使用了一个额外的类):

代码语言:javascript
运行
复制
public class Exec
{
    public short vcExtStartUp(ref string Directory, string ExtensionName)
    {   //I dont use this method
        return 1;

    }

    public short vcExtMenuExec(ref int MenuID)
    {   //this is what I need to run a WPF Application
        Application app = new Application();

        app.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative); ;

        app.Run(new MainWindow());
        return 1;
    }
}

这里我只需要第二种方法,如您所见。我的原始项目在这里抛出了一些错误,因此我尽可能地减少了我的问题,只使用包含WPFGlobalResources的项目和一个包含几乎空的MainWindow包含按钮的项目,使用字典中的样式和对字典项目的引用。

只要我在mergedDictionary的开头注释掉MainWindow.xaml的调用,一切都会正常工作(当然,我当时没有按钮风格)。如果我尝试使用ResourceDictionary,我的CAD程序会在调用DLL和调试器时崩溃,从而导致错误:(希望我正确翻译了它)。

IOException -附加信息: Assembly.GetEntryAssembly()返回NULL。定义Application.ResourceAssembly-属性或使用语法"pack://application:、、/assemblyname;component/“来定义应该从其中加载资源的程序集。

好的,然后我在new ()后面添加了Application.ResourceAssembly = typeof(MainWindow).Assembly;。现在,调试器得到了更多的信息,但是由于错误再次停止:

无法找到MainWindow.xaml linenumer12 . -> InnerException {“文件或程序集\"WPFGlobalResources,Culture=neutral\”或其依赖项。系统找不到指定的文件。“:”WPFGlobalResources,Culture=neutral"} System.Exception {System.IO.FileNotFoundException}

我也试着补充一下

代码语言:javascript
运行
复制
System.Uri resourceLocater = new System.Uri("/MainApplication;component/VisiDockedMainWindow.xaml", System.UriKind.Relative);

System.Windows.Application.LoadComponent(resourceLocater);

但没有成功,仍然是同样的错误。

现在我找不到解决办法让它起作用。有没有可能那个包://应用程序..。现在把我的计算机辅助设计程序作为应用程序,而不是我的动态链接库,WPFGlobalResources.dll (和其他所有的动态链接库)所在的位置?我怎样才能改变它呢?我在MSDN中找不到这个用程序的URI。

接下来我必须尝试的是转储我的WPFGlobalResources并将样式添加到每个窗口/用户控件中,但我希望这不是唯一的解决方案?产生了很多多余的代码..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-20 13:29:44

好吧,经过多次尝试,我同时找到了一个解决方案:

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

代码语言:javascript
运行
复制
Assembly resAssembly = Assembly.Load("WPFGlobalResources");

在使用app.Run之前。这似乎是预加载外部引用,然后可以找到它。

有趣的提示:在这种情况下,更好的做法是让WPF应用程序不做任何更改(仍然可以在App.xaml中执行),并添加一个额外的类库-项目来创建dll。然后,您可以添加一个类,启动您的WPF-应用程序(当然,您必须首先引用WPF-Projekt和ResourceDictionary):

代码语言:javascript
运行
复制
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;
    }
}

现在它终于起作用了-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42270583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档