我已经搜索了一段时间,没有找到解决具体问题的办法。
首先,我开发了一个包含多个项目的WPF应用程序,并在多个项目中使用相同的UserControls使用相同的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 -->
在我的许多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(我为此使用了一个额外的类):
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}
我也试着补充一下
System.Uri resourceLocater = new System.Uri("/MainApplication;component/VisiDockedMainWindow.xaml", System.UriKind.Relative);
System.Windows.Application.LoadComponent(resourceLocater);
但没有成功,仍然是同样的错误。
现在我找不到解决办法让它起作用。有没有可能那个包://应用程序..。现在把我的计算机辅助设计程序作为应用程序,而不是我的动态链接库,WPFGlobalResources.dll (和其他所有的动态链接库)所在的位置?我怎样才能改变它呢?我在MSDN中找不到这个用程序的URI。
接下来我必须尝试的是转储我的WPFGlobalResources并将样式添加到每个窗口/用户控件中,但我希望这不是唯一的解决方案?产生了很多多余的代码..。
发布于 2017-02-20 13:29:44
好吧,经过多次尝试,我同时找到了一个解决方案:
关键是,在执行MainWindow的xaml代码时,似乎没有加载引用。解决方案只是简单地添加一个:
Assembly resAssembly = Assembly.Load("WPFGlobalResources");
在使用app.Run之前。这似乎是预加载外部引用,然后可以找到它。
有趣的提示:在这种情况下,更好的做法是让WPF应用程序不做任何更改(仍然可以在App.xaml中执行),并添加一个额外的类库-项目来创建dll。然后,您可以添加一个类,启动您的WPF-应用程序(当然,您必须首先引用WPF-Projekt和ResourceDictionary):
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;
}
}
现在它终于起作用了-)
https://stackoverflow.com/questions/42270583
复制相似问题